首页 > 试题广场 >

小红的双生数

[编程题]小红的双生数
  • 热度指数:4588 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}小红定义一个正整数是“双生数”,当且仅当该正整数的每个数位的相邻数位中,恰好有一个和该数位的数字相同。
\hspace{15pt}现在小红拿到了一个正整数 x,她希望你求出不小于 x 的最小“双生数”。

输入描述:
\hspace{15pt}输入一个正整数 x \left(1 \leqq x \leqq 10^{100\,000}\right) 代表限制。


输出描述:
\hspace{15pt}输出一个正整数,代表不小于 x 的最小“双生数”。该数字不包含前导零。
示例1

输入

123

输出

1100

说明

\hspace{15pt}在这个样例中,1100 的第一、二个数位相同,第三、四个数位相同。我们可以证明,这是符合要求的最小的双生数。
示例2

输入

114514

输出

115500
x=input()
if len(x)%2==1:
    x=x.zfill(len(x)+1)
result=[]
length=len(x)//2
flag=-2
for i in range(length):
    a = int(x[2 * i:2 * i + 2])
    num = (a // 11 + 1) * 11 if a%11!=0 else -1
    if a % 11 == 0 and a!=flag:
        result.append(f"{a:02d}")
        flag=a
        continue
    elif a==flag&nbs***bsp;num==flag:
        result.append(str(a+11) if a==flag else str(num+11))
    else:
        result.append(str(num))
    for _ in range((length-i)//2):
        result.append('00')
        result.append('11')
    break
pos1=i
result=result[:length]
flag=0
pos=-1
for i in range(pos1,-1,-1):
    if flag==1:
        result[i]=str(int(result[i])+11)
        flag=0
    if  i-1>=0:
        if result[i] == result[i-1]:
            result[i]=str(int(result[i])+11)
    if len(result[i])>=3:
        result[i]='00'
        flag=1
        pos=i
if pos!=-1:
    result=result[:pos]
    for _ in range((length-pos+1) // 2):
        result.append('00')
        result.append('11')
if flag==1:
    result=['11','00']+result[1:]
    length+=1
result=result[:length]

print(''.join(result))

发表于 2025-12-20 17:38:50 回复(0)