题目思路还是很直接,首先按要求生成字符串。如果该目标字符串小于原字符串,那么从第k位开始,找到最后一个非9的位置,++,同时如果有9,要考虑进位(一开始没有考虑WA了一次)。
犯了一个错误,就是比较字符串大小时,一开始写的是如果b中有一个小于a,就return false.WA了半天。可以直接用strcmp()。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=2e5+5; 4 int n,k; 5 char a[N],b[N]; 6 bool check() 7 { 8 for(int i=1;i<=n;i++) 9 { 10 if(a[i]<b[i]) 11 return true; 12 if(a[i]>b[i]) 13 return false; 14 } 15 return true; 16 } 17 int main() 18 { 19 while(scanf("%d%d",&n,&k)!=EOF) 20 { 21 scanf("%s",a+1); 22 for(int i=1;i<=n;i++) 23 { 24 if(i<=k) 25 b[i]=a[i]; 26 else 27 b[i]=b[i-k]; 28 } 29 int p; 30 if(!check())//strcmp(b+1,a+1)<0 31 { 32 p=k; 33 while(b[p]=='9'&&p>1)//忘记考虑9不能再加1的情况 34 { 35 b[p]='0'; 36 p--; 37 } 38 b[p]++; 39 for(int i=k+1;i<=n;i++) 40 b[i]=b[i-k]; 41 } 42 printf("%d ",n); 43 for(int i=1;i<=n;i++) 44 printf("%c",b[i]); 45 printf(" "); 46 } 47 return 0; 48 }