http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2633
大数
题意描述:输入N组数据,计算每一个比该数大并且每位数字之和可被十整除的最小数字,例如202 2+0+2=4,10-4=6,所以208符合题意;
1:若最后一位数字加上补齐的数字之和依然不大于9,就比如202的例子可直接输出加上6的结果208;
2:若大于9则有分为两种情况(1)从第一位一直进到最后一位就像999998,每位之和44此时结果只有一种情况符合也就是1000009,直接输出之;(2)进位没有进到最后在这里我举例说明比如80998 sum=34 只需再加6 ,然后6+8=14 每进一位这个14必须减一才可以符合题目要求,所以用一个bit 变量记录进了几位 然后减之 后面的公式就出现了用a【len-1】保存14,每进一位就减一最后对10取余就ok了,对于加100000的意思是,此题不会超过十万位,因此进位的bit变量是很大的,这个十万是为了中和其中相减所产生的负值,比如进位bit=74,然后啊a【len-1】不会超过20,这样一减就成负值了。公式:a[len-1]=(a[len-1]+100000-bit)%10;
代码:
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 int n, i,len,ans; 6 int sum; 7 char ch[100050]; 8 int a[100050]; 9 scanf("%d",&n); 10 while(n--) 11 { 12 sum=0; 13 scanf("%s",ch); 14 len=strlen(ch); 15 for(i=0; i<len; i++) 16 { 17 a[i]=ch[i]-'0'; 18 sum+=a[i]; 19 } 20 21 ans=10-sum%10; 22 a[len-1]+=ans; 23 int bit=0; 24 if(a[len-1]>9) 25 { 26 for(i=len-2; i>=0; i--) 27 { 28 bit++; 29 a[i]++; 30 a[i]%=10; 31 if(a[i]) 32 break; 33 } 34 if(i<0) 35 { 36 printf("1"); 37 for(i=0; i<=len-2; i++) 38 printf("0"); 39 printf("9"); 40 } 41 else 42 { 43 a[len-1]=(a[len-1]+100000-bit)%10; 44 for(i=0; i<len; i++) 45 printf("%d",a[i]); 46 } 47 } 48 else 49 { 50 for(i=0; i<len; i++) 51 printf("%d",a[i]); 52 } 53 printf("\n"); 54 } 55 return 0; 56 }