7-38 数列求和-加强版 (20 分) python版
题目
给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+A**A+AAA+⋯+A**A⋯A(N个A)。例如A=1, N=3时,S=1+11+111=123。
输入格式:
输入数字A与非负整数N。
输出格式:
输出其N项数列之和S的值。
输入样例:
1 3
输出样例:
123
思路
- 当n特别大的时候,计算出来,c语言输出不出来,python会超时
- 先把每项的个位数全部提取出来,N个A相乘
- 然后把每个进位的数存下来
- 再把十位求和N-1个A相乘,然后要把前面进位的数也要加进来,再进位
- 如此循环
- 当l[]数组最前面一个数不为零时,说明最高位的数也进位了
- 最后再循环,把每个数挨个打出来
举例说明:
A:9,N=9
l[8]=(9*9+0)//10=8 备注:“//”意味着取模运算,比如12//10=1
l[7]=(8*9+8)//10=8
.。。。
l=[1,2,3,4,5,6,7,8,8]
l[0]!=0 意味最高位也进位了
打印出add 此时add代表最高位的进位数
然后再循环回溯之前的数,每个数的个位数也就代表当前位的数了
最后挨个打印出每个数
c语言
c代码参考:此大佬
# include <stdio.h>
int main(void) {
int A, N, i, add=0; //add是进位数
int a[100000];
scanf("%d %d", &A, &N);
if (0 == N) {
printf("0");
}
for (i=N; i>=1; i--) {
add = (i*A+add)/10; // 最终结果表示最高位的数字,括号里的add是前一个的进位数
a[i-1] = add;
}
if (0 != add)
printf("%d", add); //此时的add为最前面的位数
for (i=1; i<=N; i++) {//逐个回溯到前面求出个数也就是当前位所得的数
if (i == N) {
printf("%d", (i*A)%10);
} else {
printf("%d", (i*A+a[i])%10);
}
}
return 0;
}
python实现
a,n=map(int,input().split())
add=0
l=[0]*100000
if n==0:print("0")
for i in range(n,0,-1):
add=(i*a+add)//10
l[i-1]=add
if add!=0:print(add,end='')
for i in range(1,n+1):
if n==i:print((i*a)%10,end='')
else:print((i*a+l[i])%10,end='')