数列求和

给定某数字A(1A9)以及非负整数N(0N100000),求数列之和S=A+AA+AAA++AAA(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 }

 

转载于:https://www.cnblogs.com/FengZeng666/p/9682177.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值