本题为校赛第二题,要满足两个条件,一个就是新数字必须大于或者等于老数字,第二个就是要保证数字全部相同,例如 111 22222
刚开始我是这样想的,我先判断这个数字是否全部数字一样,可以写一个函数,可以利用除10余10的方法把每一个数位都获取,最后判断是否是全部数字一样,如果一样直接输出,如果不一样则再加一再判断,满分60,我得了55,最后一个时间超了,我想会不会有更加简便的办法呢?还真被我想出来了。
我输入一个数 比如 2549 此时 只有两种可能性 就是 2222 3333
而且这两种可能性还都是和原数据数位一致。可以把数字的第一位读取下来,
再进行填充,就拿上面的例子来说,2549,第一位是 2,填充后为 2222,2222比2549小,则表明2222这个数字2549已经错过,所以必然是3333,此时只要连着输出4个3就可以了,否则就输出刚才得到的2222就可以了。但是个位数时会出错,直接个位数按原位输出即可。
代码如下
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int a;
int length = 0;
int b = 0;
while(n--){
length = 0;
b = 0; // 保证每次循环数字重置
cin>>a;
if(a <= 9 ) { // 个位数特殊情况
cout<<a<<endl;
continue;
}
int d = a; // 保存原来的数据 以便和填充数进行比较
while(1){
a = a/10;
length++; // 循环求位数和第一位的值
if(a<10) break;
}
length++; // 由于求第一位 第一位没除10 所以求位数还要加1
int first = a; // 求出第一位
for(int i=0;i<length;i++){
b = 10*b+first; // 进行填充
}
if(d>b){ // 如果填充数比原数小 则已经错过 直接输出位数个加一值即可
for(int i=0;i<length;i++){
cout<<first+1;
}
cout<<endl;
}
else{ // 如果填充数比原数大 则未错过 则直接输出即可
cout<<b<<endl;
}
}
return 0;
}