06 习题2.3 数列求和-加强版(编程题)【PTA浙大版《数据结构(第2版)》题目集】

06 习题2.3 数列求和-加强版(编程题)【PTA浙大版《数据结构(第2版)》题目集】

1.原题链接

习题2.3 数列求和-加强版 (pintia.cn)

2.题目描述

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

输入格式:

输入数字 A A A与非负整数 N N N

输出格式:

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

输入样例:

1 3

输出样例:

123

3.参考答案

本题为复习C语言基础,不涉及数据结构相关知识。

#include <stdio.h>
#define MAXN 100000
int main(){
    
    
    int N, i;
    int A, S[MAXN]={
    
    0}, C=0;
    scanf("%d %d", &A, &N);
    if (!N) {
    
    
        printf("0\n");
        return 0;
    }
    for (i=0; i<N; i++) {
    
    
        C += A * (N-i);
        S[i] = C%10;
        C /= 10;
    }
    if (C) printf("%d", C);
    for (i=N-1; i>=0; i--)
        printf("%d", S[i]);
    printf("\n");
}

4.解题思路

当N稍大时N个A就超过了长整型的取值范围了,所以不能用整型或长整型来表示数列和S,而要用数组来表示S的每一位数。

在计算数列和时,可以先计算所有项中个位数的和,再计算十位数的和,再计算百位数的和,再计算千位数的和,依次类推。

把按上述方法计算的和边累加边逐位存入数组里:

  • 先算个位数的和C = A * N;,C对10取余就是S的个位数S[0] = C%10;,S的个位数记在S[0]C /= 10;就得到个位数的和舍去个位进到十位的值。
  • 再算十位数的和C+ = A * (N-1);,这里的C是数列全部项的十位数的和再加上个位数的和的进位值,此时的C对10取余就是S的十位数S[1] = C%10;,S的十位数记在S[1]C /= 10;就得到十位数的和舍去十位进到百位的值。
  • 后面百位、千位等以此类推。

最后从数组下标大到小输出数组的每一位数就是数列和S。

5.答案详解

#include <stdio.h>
#define MAXN 100000	//	题目中N的最大值

int main(){
    
    
    int N, i;
    int A, S[MAXN]={
    
    0}, C=0;
	//输入A和N
    scanf("%d %d", &A, &N);
    //如果N为0,输出0,结束程序,当然也可以写错if-else的形式,这里直接用了return 0结束程序
    if (!N) {
    
    
        printf("0\n");
        return 0;
    }
	//如果N不为0,计算数列和的每一位,将每一位的值存入数组S
    for (i=0; i<N; i++) {
    
    
        C += A * (N-i);
        S[i] = C%10;
        C /= 10;
    }
    //最后一次循环如果C有进位值没有存入数组,输出这个值
    if (C) printf("%d", C);
    //从数组下标大到小输出数组的每一位数就是数列和S
    for (i=N-1; i>=0; i--)
        printf("%d", S[i]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_40171190/article/details/129921431