给定某数字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
思路
最开始我的做法是把输入的基数拼成一个字符串,再把各个字符串的值加起来,代码如下:
// 非AC代码
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char base = '\0';
int times = 0;
cin >> base >> times;
char* input_str = new char[times + 1];
memset(input_str, 0x0, times+1);
for(int i = 0; i < times; i++)
input_str[i] = base;
unsigned sum = 0;
int len = strlen(input_str);
while(times--) {
unsigned tmp = base - '0';
for(int i = 0; i < len-1; i++) {
tmp = tmp * 10 + (input_str[i] - '0');
}
sum += tmp;
len--;
}
cout << sum;
return 0;
}
但是这个代码没有只过了2个测试点。在网上观察别人的解法后,基本可以可以认为这是一个大数运算型的题目,这种类型只能模拟手算过程。
代码
#include <iostream>
#include <stack>
using namespace std;
int main() {
int base = 0, times = 0;
cin >> base >> times;
if(times == 0) {
printf("0\n");
return 0;
}
stack<int> cnt;
int carry = 0;
for(int i = times; i >= 1; i--) {
int tmp = carry + base * i;
cnt.push(tmp % 10);
carry = tmp / 10;
}
if(carry != 0) printf("%d", carry);
while( !cnt.empty() ) {
cout << cnt.top();
cnt.pop();
}
cout << endl;
return 0;
}