06 习题2.3 数列求和-加强版(编程题)【PTA浙大版《数据结构(第2版)》题目集】
1.原题链接
2.题目描述
给定某数字 A A A( 1 ≤ A ≤ 9 1\le A\le 9 1≤A≤9)以及非负整数 N N N( 0 ≤ N ≤ 100000 0\le N\le 100000 0≤N≤100000),求数列之和 S = A + A A + A A A + ⋯ + A A ⋯ A S = A + AA + AAA + \cdots + AA\cdots A S=A+AA+AAA+⋯+AA⋯A( 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;
}