题目
给定某数字 A ( 1 ≤ A ≤ 9 ) A(1≤A≤9) A(1≤A≤9) 以及非负整数 N ( 0 ≤ N ≤ 100000 ) N(0≤N≤100000) N(0≤N≤100000),求数列之和 S = A + A A + A A A + ⋯ + A A ⋯ A ( N 个 A ) S = A + AA + AAA + ⋯ + AA ⋯ A(N个A) S=A+AA+AAA+⋯+AA⋯A(N个A)。例如 A = 1 , N = 3 A = 1, N = 3 A=1,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
题解
解题思路
首先输入两个正整数,然后个位数是 n ∗ a n * a n∗a,进位 n ∗ a / 10 n * a / 10 n∗a/10,余位 n ∗ a n * a % 10 n∗a;十位数是 ( n − 1 ) ∗ a (n - 1) * a (n−1)∗a 加前面的进位,进位除以十,余位是余数,依此类推,最后计算出结果即可。
完整代码
#include<iostream>
using namespace std;
int main(void)
{
int A, N;
cout << "请输入两个正整数:"; // 提交时注释此行
cin >> A >> N;
int *R = new int[N + 2]; // 存储各个位上的数字,根据规律,一般结果为 N 位,若下标从 1 开始且考虑最后一次进位,规模为 N + 2
R[1] = 0; // 初始化下标为 1 处的数字为 0,以处理 0 的特殊情况
int bit = 1, carry = 0; // 初始化位数为 1,进位为 0
for(int i = N; i >= 1; i--)
{
int t = i * A + carry;
R[bit] = t % 10; // 保留最低位
carry = t / 10; // 保留进位
if(i > 1) // 如果不是最后一次运算,位数增 1
bit++; // 这里的自增相当于为下一次运算做准备,故自增后的位数为下一次运算后的位数
else if(carry) // 如果最后一次运算产生进位,进位不为 0
R[++bit] = carry; // 位数自增 1,存储此进位
}
for(int i = bit; i >= 1; i--) // 输出结果,注意下标范围为位数到 1
cout << R[i];
return 0;
}