一.题目描述:
给定某数字A(1≤ A ≤9)以及非负整数N(0≤ N ≤100000),求数列之和S=A+AA+AAA+...+AA...A(N个A)。例如A=1,N=3时,S=1+11+111=123。
二.题目分析:
当N较小时,直接模拟相加即可
当N较大时,会超过整型的数值表示范围,要用数组来模拟相加的过程,类似于列式手写计算。
#include <stdio.h>
#define MAXN 100000
int main()
{
int A, N;
int S[MAXN], K[MAXN], C, i, j;
scanf("%d %d", &A, &N);
if (!N) { /* 处理N为0时的特殊情况 */
printf("0\n");
return 0;
}
for (i=0; i<N; i++) {
S[i] = 0; /* 初始化大数和各位均为0 */
K[i] = A; /* 数列项的每位都是A */
}
C = 0; /* 初始化进位为0 */
for (i=0; i<N; i++) { /* 对每个数列项K[0]~K[i]*/
for (j=0; j<=i; j++) { /* 逐位求和 */
S[j] += (K[j]+C);
C = S[j]/10;
S[j] %= 10;
}
}
if (C) printf("%d", C); /* 输出最高位的进位 */
for (i=N-1; i>=0; i--)
printf("%d", S[i]);
printf("\n");
return 0;
}
优化:求和时可以发现个位数有N个A相加,十位数有N-1个A相加,百位数有N-2个A相加,以此类推我们可以直接计算个位数,十位数的结果。
#include <stdio.h>
#define MAXN 100000
int main()
{
int A, N;
int i, S[MAXN], C;
scanf("%d %d", &A, &N);
if (!N) { /* 处理N为0时的特殊情况 */
printf("0\n");
return 0;
}
for (i=0; i<N; i++) S[i] = 0; /* 初始化大数和各位均为0 */
C = 0; /* 初始化进位为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");
return 0;
}
参考书籍:数据结构学习与实验指导(第2版)