7-38 数列求和-加强版 (20 分)

7-38 数列求和-加强版 (20 分)

定某数字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

我的超时代码(最终测试点)

#include <algorithm>
#include <iostream>
#include <string>

using namespace std;
string Trans(int A, int x);
string Add(string A, string B);

int main(){
    int A, N;
    cin >> A >> N;
    if (N == 0){
        cout << "0";
        return 0;
    }
    string One, Two, Sum;
    One += (A+'0');
    for (int i = 2; i <= N; i++){
        Two = Trans(A, i);
        One = Add(One, Two);
    }
    cout << One;

    return 0;
}

string Trans(int A, int x){
    string str;
    for (int i = 0; i < x; i++){
        str += (A+'0');
    }
    return str;
}

string Add(string A, string B){
    string C;
    int i = A.size()-1;
    int j = B.size()-1;
    int Bas = 0, Adv = 0;

    while (i >= 0 && j >= 0){
        Bas = (A[i]-'0')+(B[j]-'0');
        C += (Adv + Bas)%10 + '0';
        Adv = (Adv + Bas)/10;
        --i;
        --j;
    }
    if (j >= 0){
        int Judge = (B[j]-'0')+Adv;
        if (Judge >= 10){
            C += "01";
        }
        else {
            C += (Judge+'0');
        }
        for (int k = j-1; k >= 0; k--){
            C += B[k];
        }
    }
    else if (i >= 0){
        int Judge = (B[i]-'0')+Adv;
        if (Judge >= 10){
            C += "01";
        }
        else {
            C += (Judge+'0');
        }
        for (int k = i-1; k >= 0; k--){
            C += A[k];
        }
    }
    else {
        C += (Adv+'0');
    }
    reverse(C.begin(), C.end());

    return C;
}

参考优秀代码

详细参见:https://blog.csdn.net/qq_37729102/article/details/80686157

#include<iostream>
using namespace std;
int main()
{
	int A,N;
	cin>>A>>N;
	int *R=new int[N+2];//存储各个位上的数字,根据规律,一般结果为N位,若下标从1开始且考虑最后一次进位,规模为N+2 
	R[1]=0;//初始化下标为1处的数字为0,以处理0的特殊情况 
	int bitnum=1,carry=0;//初始化位数为1,进位为0 
	for(int i=N;i>=1;i--)
	{
		int t=i*A+carry;
		R[bitnum]=t%10;//保留最低位 
		carry=t/10;//保留进位 
		if(i>1)//如果不是最后一次运算,位数增1 
		bitnum++;//这里的自增相当于为下一次运算做准备,故自增后的位数为下一次运算后的位数 
		else if(carry)//如果最后一次运算产生进位,进位不为0 
		R[++bitnum]=carry;//位数自增1,存储此进位 
	}
	for(int i=bitnum;i>=1;i--)//输出结果,注意下标范围为位数到1 
	cout<<R[i]; 
	return 0;
}

个人参考后复写代码

#include<iostream>
int main(){
    using namespace std;
    int A, N;
    cin >> A >> N;
    if (N == 0){
        cout << "0";
        return 0;
    }
    int *Store = new int [N+2];
    int Bas = 1, Adv = 0;
    for (int i = N; i >= 1; i--){
        int Temp = i*A + Adv;
        Store[Bas] = Temp%10;
        Adv = Temp/10;
        if (i > 1){
            Bas++;
        }
        else if (Adv){
            Store[++Bas] = Adv;
        }
    }
    for (int i = Bas; i >=1 ;i--){
        cout << Store[i];
    }
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值