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 }

 

posted @ 2013-08-10 16:39  WangLC  阅读(593)  评论(0编辑  收藏  举报