码迷,mamicode.com
首页 > 其他好文 > 详细

厦门大学线下编程比赛第一题:求和

时间:2015-08-18 18:25:53      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:


给定a和n,计算a+aa+aaa+aaaa+...+a...a(n个a) 的和。 输入描述: 测试数据有多组,以文件结尾。每行输入a,n(1<=a,n<=1000000)。 输出描述: 由于结果可能比较大,所以请输出答案mod 1000000007。

仔细审题,假设a=2,n=6;那么要求的和Σ = 2 + 22 + 222 + 2222 + 22222 + 222222

貌似也不难,只要知道n的长度,只需要把这些数值加起来不就行了吗?

再看题中提示:由于结果可能比较大,所以请输出答案mod 1000000007。

如果n很大时,超过定义数据类型的最大长度,这道题使用传统意义上的加法运算,貌似有点不可取。

看一下这个数据(a=3,n=8)

3
33
333
3333
33333
333333
3333333
33333333

 

个位数的和是 8 * 3 = 24,十位数的和是7 * 3 + 2= 21 + 2 = 23 (2来自个位和24的进位2),百位数的和是6 * 3 + 2 = 18+2=20 (2来自十位和23的进位2)......通过这个逻辑,我们可以推算出计算 给定a和n,计算a+aa+aaa+aaaa+...+a...a(n个a) 的和 的算法

 1 #include<stdio.h>
 2 #define MAX 1000000
 3 int main()
 4 {
 5     int a = 3,n= 99;
 6     int i,tmp=0;
 7     char array[MAX+1]= {0};
 8     //倒序相加
 9     for(i=0; i<n; i++)
10     {
11         tmp = a*(n-i)+tmp;
12         array[i] = tmp%10;
13         tmp = tmp/10;
14     }
15     while(tmp>0)
16     {
17         array[n++] = tmp%10;
18         tmp = tmp/10;
19     }
20     //倒序输出
21     for(i=n-1; i>=0; i--) printf("%d",array[i]);
22     printf("\n");
23 
24     return 0;
25 }

运行结果:

技术分享

可见结果的确很长,题中输出描述:

由于结果可能比较大,所以请输出答案mod 1000000007

现在要做的事情就是如何将上面那么长的数据结果mod 1000000007。

我使用下面这种思路,比如有一个数 123456789,计算 123456789 mod 100007的值

第一步:123456789 - 100007000 = 23449789

第二步:23449789 - 10000700 = 13449089

第三步:13449089 - 10000700 = 3448389

第四步:3448389 - 1000070 = 2448319

第五步:2448319 - 1000070 = 1448249

第六步:1448249 - 1000070 = 448179

第七步:448179 - 100007 = 348172

第八步:348172 - 100007 = 248165

第九步:248165 - 100007 = 148158

第十步:148158 - 100007 = 48151

最终求得 123456789 mod 100007 = 48151

仔细想为什么呢?

既然思路已经有了,那么就上代码了。

  1 #include<stdio.h>
  2 #define MAX 1000000
  3 int main()
  4 {
  5     int a = 3,n= 99;
  6     int i,tmp=0;
  7     char array[MAX+1]= {0};
  8     //倒序相加
  9     for(i=0; i<n; i++)
 10     {
 11         tmp = a*(n-i)+tmp;
 12         array[i] = tmp%10;
 13         tmp = tmp/10;
 14     }
 15     while(tmp>0)
 16     {
 17         array[n++] = tmp%10;
 18         tmp = tmp/10;
 19     }
 20     //倒序输出
 21     for(i=n-1; i>=0; i--) printf("%d",array[i]);    
 22     printf("\n");
 23 
 24     int n1=n;
 25     while(n-n1>0 || n1-10>=0)
 26     {
 27         int b=0;
 28         //判断前十位是不是大于1000000007,如果不大于,判断前11位
 29         if(!b&&array[n1-1]>1)b=1;
 30         if(!b&&array[n1-2]>0)b=1;
 31         if(!b&&array[n1-3]>0)b=1;
 32         if(!b&&array[n1-4]>0)b=1;
 33         if(!b&&array[n1-5]>0)b=1;
 34         if(!b&&array[n1-6]>0)b=1;
 35         if(!b&&array[n1-7]>0)b=1;
 36         if(!b&&array[n1-8]>0)b=1;
 37         if(!b&&array[n1-9]>0)b=1;
 38         if(!b&&array[n1-10]>7)b=1;
 39         if (!b)
 40         {
 41             n1--;
 42             continue;
 43         }
 44 
 45         b=0;//是否需要借位
 46         if (array[n1-10]>=7)
 47         {
 48             array[n1-10]-=7;
 49             b=0;
 50         }
 51         else
 52         {
 53             array[n1-10]+=3;
 54             b=1;
 55         }
 56 
 57         for(i=9; i>=2; i--)
 58         {
 59             if(b)
 60             {
 61                 if(array[n1-i]>=1)
 62                 {
 63                     array[n1-i]-=1;
 64                     b=0;
 65                 }
 66                 else
 67                 {
 68                     array[n1-i]=9;
 69                     b=1;
 70                 }
 71             }
 72         }
 73 
 74         if (n-n1>0)
 75         {
 76             if(b)
 77             {
 78                 array[n1-1]=array[n1]*10+array[n1-1]-2;
 79             }
 80             else
 81             {
 82                 array[n1-1]=array[n1]*10+array[n1-1]-1;
 83             }
 84             array[n1]=\0;
 85         }
 86         else
 87         {
 88             if(b)
 89             {
 90                 array[n1-1]=array[n1-1]-2;
 91             }
 92             else
 93             {
 94                 array[n1-1]=array[n1-1]-1;
 95             }
 96         }
 97         n1=--n;
 98     }
 99 
100     //倒序输出
101     for(i=n-1; i>=0; i--) printf("%d",array[i]);
102     printf("\n");
103 
104     return 0;
105 }

运算结果:

技术分享

 

厦门大学线下编程比赛第一题:求和

标签:

原文地址:http://www.cnblogs.com/preacher/p/4739585.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!