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;
}