给定某数字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
这题难度不高,唯一的难点就是N的值范围很大,如果使用一般加法运算的话,时间肯定会超出的.
比如下面这种:
int A, N;
scanf("%d %d", &A, &N);
if (N == 0)
{
cout << 0 << endl;
return 0;
}
for (int i = 1; i <= N; ++i)
{
//放着i个A的数组.
vector<int> add(i, A);
while (length < add.size())
{
length++;
}
//当位数相同时.相加.
for (int j = 0; j < add.size(); ++j)
{
sum[j] += add[j];
}
int n = length;
for (int j = 0; j < n; ++j)
{
if (sum[j] >= 10)
{
if (j == length - 1)
{
sum[length++] = sum[j] / 10;
}
else
sum[j + 1] += sum[j] / 10;
sum[j] = sum[j] % 10;
}
}
}
但这题巧妙的就在于.作为加数的每个位的数字都是一样的.所以可以直接计算每一位的值.然后进行进位即可.
int A, N;
scanf("%d %d", &A, &N);
if (N == 0)
{
cout << 0 << endl;
return 0;
}
vector<int> sum(100002, 0);
int length = N;
for (int i = 0, j = N; i < N; ++i, --j)
{
sum[i] += A*j;
if (sum[i] >= 10)
{
sum[i + 1] = sum[i] / 10;
//如果最高位要进位.则length++.最后输出结果的时候,多输出一位.
if (i + 1 == N)
length++;
sum[i] = sum[i] % 10;
}
}
for (int i = length - 1; i >= 0; --i)
cout << sum[i];