7-38 数列求和-加强版

7-38 数列求和-加强版 (20 分) python版

题目

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

输入格式:

输入数字A与非负整数N

输出格式:

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

输入样例:

1 3

输出样例

123

思路

  1. 当n特别大的时候,计算出来,c语言输出不出来,python会超时
  2. 先把每项的个位数全部提取出来,N个A相乘
  3. 然后把每个进位的数存下来
  4. 再把十位求和N-1个A相乘,然后要把前面进位的数也要加进来,再进位
  5. 如此循环
  6. 当l[]数组最前面一个数不为零时,说明最高位的数也进位了
  7. 最后再循环,把每个数挨个打出来

举例说明:

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='')
posted @ 2021-03-08 20:36  LUcKy_wA  阅读(285)  评论(0编辑  收藏  举报