zoukankan      html  css  js  c++  java
  • 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='')
    
  • 相关阅读:
    JAVA Number类
    ConcurrentHashMap.Segment源码解析
    Java Concurrent包初探
    JAVA枚举类
    构造不可变类及其优点
    Unsafe类初探
    Paxos made simple 翻译尝试
    平行二叉堆和优先队列
    Android OpenCV学习
    Android-Java和HTML5交互-混合开发-优化
  • 原文地址:https://www.cnblogs.com/Azhenhs/p/14502054.html
Copyright © 2011-2022 走看看