首先对输入整数的位数进行奇偶判断:如果是奇数位就比较好处理了,添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;
}