首先对输入整数的位数进行奇偶判断:如果是奇数位就比较好处理了,添1位后用"11"、"00"填充;
如果是偶数位,首先需要从整数高位到低位,两位两位进行遍历,遇到不同的一对就改成数值相同的,并把后面的用0011”清零“。
现在每一对都是数值相同的了,需要进行重复数字判断以及进位处理:
从低位到高位进行遍历,发现两对数值的相同的,就把低位的一对加1。加1后如果有进位,则一直运算到没有进位为止,然后重新回到整数的最低位开始遍历;如果没有进位,则需要判断该低位对后面是否有内容,如果有的话,需要把后面的用0011”清零“。
#include <stdio.h>
#include <string.h>
int main() {
char integer[100001];
scanf("%s", integer);
char res[100001]; //双生数必然为偶数位
int wei = strlen(integer);
int len = 0;
if (wei % 2) //输入整数是奇数位
{
len = (wei + 1) / 2;
for (int i = 0; i < len; i++)
{
if (i % 2 == 0) {
strcat(res, "11");
}
else {
strcat(res, "00");
}
}
}
else { //输入整数是偶数位
len = wei / 2;
strcpy(res, integer);
int flag = 0;
int jinwei = 0;
for (int i = 0; i < wei; i++)
{
if (i % 2)
{
if (integer[i] != integer[i-1] && flag == 0)
{ //第一对不一样的
if (integer[i-1] > integer[i]) {
res[i] = integer[i-1];
}
else {
res[i-1] = integer[i-1] + 1;
res[i] = res[i-1];
}
flag = 1;
}
else if (flag == 1)
{
res[i-1] = '0';
res[i] = '0';
flag = 2;
}
else if (flag == 2)
{
res[i-1] = '1';
res[i] = '1';
flag = 1;
}
else continue;
}
}
int pos = wei - 1;
while(pos - 2 > 0)
{
if (res[pos] == res[pos-2]) // 有重复
{
res[pos] = res[pos] + 1;
res[pos-1] = res[pos];
if (res[pos] > '9') //有进位
{
res[pos] = '0';
res[pos-1] = '0';
jinwei = 1;
int pos1 = pos - 2;
while(jinwei == 1 && pos1 > 0) {
res[pos1] = res[pos1] + 1;
res[pos1-1] = res[pos1];
if (res[pos1] > '9') {
res[pos1] = '0';
res[pos1-1] = '0';
jinwei = 1;
pos1 -= 2;
}
else {
jinwei = 0;
}
} //进位到底
}
else { //无进位,后面”0011清零“
if (pos + 1 < wei) { //后面有内容
int lenZero = (wei - pos) / 2;
for (int j = 1; j <= lenZero; j++)
{
if (j % 2) {
res[pos+2*j] = '0';
res[pos+2*j-1] = '0';
}
else {
res[pos+2*j] = '1';
res[pos+2*j-1] = '1';
}
}
}
}
pos = wei + 1; //重新判断
}
pos -= 2;
}
if (res[0] == '0') //进位导致位数增多的,需重新处理
{
memset(res, 0, wei+2);
for (int i = 0; i < len + 1; i++)
{
if (i % 2 == 0) {
strcat(res, "11");
}
else {
strcat(res, "00");
}
}
}
}
printf("%s\n", res);
return 0;
}

京公网安备 11010502036488号