给定某数字 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。
输入格式:
输入数字 A 与非负整数 N。
输出格式:
输出其 N 项数列之和 S 的值。
输入样例:
1 3
结尾无空行
输出样例:
123
结尾无空行
来源:
来源:PTA | 程序设计类实验辅助教学平台
链接:https://pintia.cn/problem-sets/14/exam/problems/3006
提交:
题解:
#include<stdio.h>
int main() {
int A, N;
scanf("%d %d", &A, &N);
if (N == 0) {
printf("0");
return 0;
}
// 求和结果数组,初始化为 N 个 A
int result[100000] = {0};
for (int i = 0; i < N; i++) {
result[i] = A;
}
// 进位
int carry = 0;
// 从数组后往前,逐次模拟加法运算
for (int i = N - 1; i > 0; i--) {
/*
* 第 N-1 列有 N 个 A,N-2 列有 N-1 个 A······其值为所有 A 的和加上来自低位的进位
* 如 A = 3,N = 5 时,33333 + 3333 + 333 + 33 + 3 = 37035
* 33333
* 3333
* 333
* 33
* 3
* 循环过程执行如下:
* i = 4:
* - result[4] = 3 * (4 + 1) + 0 = 15
* - carry = 1
* - result[4] = 5
* i = 3:
* - result[3] = 3 * (3 + 1) + 1 = 13
* - carry = 1
* - result[3] = 3
* i = 2:
* - result[2] = 3 * (2 + 1) + 1 = 10
* - carry = 1
* - result[2] = 0
* i = 1:
* - result[1] = 3 * (1 + 1) + 1 = 7
* - carry = 0
* - result[1] = 7
* result[0] = 3 + 0 = 3
* result = {3, 7, 0, 3, 5} = 37035
*/
result[i] = result[i] * (i + 1) + carry;
carry = result[i] / 10;
result[i] = result[i] % 10;
}
// 最高位的值为 A 加上来自低位的进位
result[0] = A + carry;
// 输出最终和
for (int i = 0; i < N; i++) {
printf("%d", result[i]);
}
return 0;
}