编程题 7-38 数列求和-加强版【PAT】

文章目录

编程练习题目集目录

题目

给定某数字 A ( 1 ≤ A ≤ 9 ) A(1≤A≤9) 以及非负整数 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) 。例如 A = 1 , N = 3 A = 1, N = 3 时, S = 1 + 11 + 111 = 123 S = 1 + 11 + 111 = 123

输入格式

输入数字 A A 与非负整数 N N

输出格式

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

输入样例

1 3

输出样例

123

题解

解题思路

首先输入两个正整数,然后个位数是 n ∗ a n * a ,进位 n ∗ a / 10 n * a / 10 ,余位 n ∗ a n * a % 10 ;十位数是 ( 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; }
本文是转载文章,点击查看原文
如有侵权,请联系 lx@jishuguiji.net 删除。