给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S = A + AA + AAA + ⋯ + AA⋯ANA)。例如A = 1, N = 3时,S = 1+11+111=123。

输入格式:

输入数字A与非负整数N

输出格式:

输出其N项数列之和S的值。

输入样例:

  1. 1 3

输出样例:

  1. 123

思路

最开始我的做法是把输入的基数拼成一个字符串,再把各个字符串的值加起来,代码如下:

  1. // 非AC代码
  2. #include <iostream>
  3. #include <cstring>
  4. using namespace std;
  5. int main() {
  6. char base = '\0';
  7. int times = 0;
  8. cin >> base >> times;
  9. char* input_str = new char[times + 1];
  10. memset(input_str, 0x0, times+1);
  11. for(int i = 0; i < times; i++)
  12. input_str[i] = base;
  13. unsigned sum = 0;
  14. int len = strlen(input_str);
  15. while(times--) {
  16. unsigned tmp = base - '0';
  17. for(int i = 0; i < len-1; i++) {
  18. tmp = tmp * 10 + (input_str[i] - '0');
  19. }
  20. sum += tmp;
  21. len--;
  22. }
  23. cout << sum;
  24. return 0;
  25. }

但是这个代码没有只过了2个测试点。在网上观察别人的解法后,基本可以可以认为这是一个大数运算型的题目,这种类型只能模拟手算过程。

7-38.png


代码

  1. #include <iostream>
  2. #include <stack>
  3. using namespace std;
  4. int main() {
  5. int base = 0, times = 0;
  6. cin >> base >> times;
  7. if(times == 0) {
  8. printf("0\n");
  9. return 0;
  10. }
  11. stack<int> cnt;
  12. int carry = 0;
  13. for(int i = times; i >= 1; i--) {
  14. int tmp = carry + base * i;
  15. cnt.push(tmp % 10);
  16. carry = tmp / 10;
  17. }
  18. if(carry != 0) printf("%d", carry);
  19. while( !cnt.empty() ) {
  20. cout << cnt.top();
  21. cnt.pop();
  22. }
  23. cout << endl;
  24. return 0;
  25. }