0
点赞
收藏
分享

微信扫一扫

数列求和

给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1, N=3时,S=1+11+111=123。

输入格式:

输入数字A与非负整数N。

输出格式:

输出其N项数列之和S的值。

输入样例:                       输入样例:

​1 3               6 100​

输出样例:                       输出样例:

​123              7407407407407407407407407407407407407407407407407407407407407407407407407407407407407407407407407340​

 

解题思路:  我们发现,求和时个位数上共有N个A相加,十位数上共有N-1个A相加,依此类推。因此,可以直接计算个位数的结果,十位数的结果,等等。每个数位的结果为(N-K)*A加上进位值,需要O(1)时间;总共有N个数位,因此时间复杂度为O(N)。

大整数的表示方法:可以将大整数的十进制表示中的每个数为值放在数组中的对应位置。

 

1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int sum[120000000]; //由于N的值可以很大,可能超过整数的表示范围,所以用数组来保存计算结果
5
6 int main()
7 {
8 int A, N;
9 scanf("%d %d", &A, &N);
10 if(N == 0)
11 {
12 printf("0");
13 return 0;
14
15 }
16 sum[0] = 0;
17 int carry = 0; //carry表示进位值
18 for(int i = N; i > 0; --i)
19 {
20 int s = A * i + carry;
21 sum[i] = s % 10;
22 carry = s / 10;
23 }
24 if(carry) //注意最后的进位(最高位的进位值)要加上!!!
25 sum[0] = carry;
26 if(sum[0])
27 printf("%d", sum[0]);
28 for(int i = 1; i <= N; ++i)
29 printf("%d", sum[i]);
30
31 return 0;
32 }

 


举报

相关推荐

java:数列求和

试题B:数列求和

数列求和3 python OJ

数列求和2 python OJ

等差数列求和

zzuli oj 1052: 数列求和4(java)

习题4-4 特殊a串数列求和

0 条评论