c语言数列求和

7、数列求和

求 S = a + aa + aaa + aa...a(n 个 a)
其中 a 是一个数字(1<=a<=9), 如 S=1+11+111+1111+...。

当 n 很大的时候,S 的值可以非常大,将远远超过 int 的表示范围。但这里我们只需要求 S 的低
m 位。

例如:a=1,n=3,m=2 为例, S=1+11+111=123, 低 2 位为 23。

输入输出:

输入三个正整数a, n, m
(其中1<=a<=9 1<=n<=1000 1<=m<=9) 输出S的低m位

样例:

序号 输入 输出
1 1 3 2 23
2 1 1000 9 234567790

当n很大的时候,s超出了int 范围,那样怎么求啊,比如样例中的n=1000

其实这个题目根本不用求出S,也不用担心它会超出int范围。
因为是数列,所以就要从数列规律上去找结果。
比如a=1,n=5,s=3.列竖式
1
11
111
1111
11111
------
12345
后3位是345.
个位是5,它是怎么计算出来的?a*n
十位是4,怎么算出来的?a*(n-1)+个的进位(如果有)
百位是3,怎么算出来的?a*(n-2)+低位的进位(如果有)
照这个规律,根本不用计算S。
定义一个数组int sm[10].sm[0]保存个位,sm[1]保存十位数字就行了,。。。
我没有写出完整的程序,只是给你一个思路。自己理解一下,很好写出代码。遇到问题请教是好事。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-11-08
解:1+11+111+1111+111...1 (111...1,有n个1)
=1+(10+1)+(10^2+10+1)+(10^3+10^2+1)+...+[10^n+10^(n-1)+...1]
=1×n+10(n-1)+10^2(n-2)+...+10^n[n-(n-1)]
设Sn=1×n+10(n-1)+10^2(n-2)+...+10^n (1)
10sn=10+10^2(n-1)+10^3(n-2)+...+10^(n+1)n(2)
∴(1)-(2):
-9Sn=n+[10+10^2+10^3+10^n]-10^(n+1)n
-9Sn=n-10^(n+1)+{10[1-10^n]/(1-10)}
={n-10^(n+1)}-{10[1-10^n]/9}
∴Sn={-{n-10^(n+1)}/9}-{10[1-10^n]/81}
=10^(n+1)/9-(n/9)-{10[1-10^n]/81}
相似回答