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

编程练习题目集目录

题目

  给定某数字 A ( 1 ≤ A ≤ 9 ) A(1≤A≤9) A1A9 以及非负整数 N ( 0 ≤ N ≤ 100000 ) N(0≤N≤100000) N0N100000,求数列之和 S = A + A A + A A A + ⋯ + A A ⋯ A ( N 个 A ) S = A + AA + AAA + ⋯ + AA ⋯ A(N个A) S=A+AA+AAA++AAANA。例如 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 na,进位 n ∗ a / 10 n * a / 10 na/10,余位 n ∗ a n * a % 10 na;十位数是 ( n − 1 ) ∗ a (n - 1) * a n1)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;
}

猜你喜欢

转载自blog.csdn.net/qq_41918107/article/details/143501976