这题咋做哪位巨佬给下正解?!

学术版

Chenyuze24 @ 2025-01-11 08:39:08

小嘉定义一个正整数为“双生数”,当且仅当该正整数的每个数位的相邻数位中,恰好有一个和该数位的数字相同。

已知一个正整数 x(1 ≤ x ≤ 10¹⁰⁰⁰⁰⁰),要求出不小于 x 的最小“双生数”。

输入描述 在一行中输入一个正整数 x,其范围为 1 ≤ x ≤ 10¹⁰⁰⁰⁰⁰。

输出描述 输出一个正整数,代表不小于 x 的最小“双生数”,该数字不包含前导零。 示例 1 输入: 123 输出: 1100 示例 2 输入: 114514 输出: 115500


by yhylivedream @ 2025-01-11 08:51:59

分长度的奇偶讨论,奇数直接搞个 11 再在后面拼 00 直到长度大于原数字长度。

偶数可以找到第一个相邻数字不同的位置 p 把他后面除了 p + 1 全部变成 0,前面直接按原数字输出,把 p 变成 p + 1 即可。


by yhylivedream @ 2025-01-11 08:52:07

@Chenyuze24


by 5k_sync_closer @ 2025-01-11 09:15:12

@yhylivedream

当且仅当该正整数的每个数位的相邻数位中,恰好有一个和该数位的数字相同。


by 5k_sync_closer @ 2025-01-11 09:15:32

确实是直接分讨就行了,但是情况多一些


by yhylivedream @ 2025-01-11 09:19:45

@5k_sync_closer 没看到/kel


by Chenyuze24 @ 2025-01-11 09:35:18

@5k_sync_closer 那怎么实现恰好有一个和该数位的数字相同?


by Chenyuze24 @ 2025-01-11 09:52:51

#include<bits/stdc++.h>
using namespace std;
string str;
int main(){
    cin>>str;
    int len=str.size();
    if(len%2!=0){
        cout<<11;
        for(int i=1;i<=len-1;i++)cout<<0;
    }
    else{
        if(str[0]==str[1]){

        }
        for(int i=0;i<len;i+=2){
            if(!(str[i]==str[i+1]||str[i]==str[i-1])&&str[i-1]!=str[i+1]){
                for(int j=0;j<i;j++){
                    cout<<str[j];
                }
                int y=i;
                cout<<max(str[i],str[i+1])<<max(str[i],str[i+1]);
                for(int j=i;j<len-2;j+=2){
                    if((j-y)%4==0){
                        cout<<"00";
                    }
                    else{
                        cout<<"11";
                    }
                }
                return 0;
            }
        }
    }
} 

大概的差不多都实现了 其他的细节还不太够 能帮我看一看吗?谢谢。


by Chenyuze24 @ 2025-01-11 09:56:52

@yhylivedream@5k_sync_closer能帮我看一下吗


by yhylivedream @ 2025-01-11 09:58:04

@Chenyuze24 我的方法是错的


by jojo222 @ 2025-01-11 09:58:53

#include <bits/stdc++.h>
using namespace std;
int len, lst = 10;
bool f;
string x;
int main()
{
    cin >> x;
    len = x.size();
    if(len % 2 == 1) x.insert(0, "0");
    for(int i = 0; i < len; i += 2)
    {
        int t = (x[i] - '0') * 10 + x[i + 1] - '0';
        int ans = (t + 10) / 11;
        if(f) ans = 0;
        if(ans * 11 > t) f = true;
        if(ans == lst) ans++;
        lst = ans;
        printf("%d%d", ans, ans);
    }
    return 0;
}

| 下一页