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;
}