给定某数字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<iostream>
#define MAX 200000
using namespace std;
int main(){
int N, i, j, carry = 0;
char sum[MAX];
char A, temp;
cin >> A >> N;
if(N == 0){
cout << '0';
return 0;
}
for(i = 0; i < MAX; i++) sum[i] = '0';
for(i = 0; i < N; i++){
//从A到AAA...AAA循环
carry = 0;
for(j = 0; j <= i; j++){
temp = sum[j] + (A - '0') + carry;
if(temp > '9'){
temp -= 10;
carry = 1;
}else{
carry = 0;
}
sum[j] = temp;
}
if(carry){
temp = carry + sum[j];
if(temp > '9'){
sum[j++] = temp - 10;
sum[j++] = '1';
}else{
sum[j++] = temp;
}
}
}
for(j = i - 1; j >= 0; j--)
cout << sum[j];
}
但是最后一个测试点超时了,我就知道了自己的思路不对。已经是晚上十二点半了,也没有心情想一个新的思路重新写代码了。今中午(Σ( ° △ °|||)︴)起来,懒得很,在网上搜了一下别人的题解,感受到了差距!既然像我那样横着累加不可以,那就竖着加,提前计算好该位有多少个A,这样只需要遍历一次就可以了,大大减少了复杂度,而且代码十分简洁,如下:
#include<iostream>
using namespace std;
int main(){
int A, N, i, j, carry, temp;
int array[200000];
cin >> A >> N;
if(!N) cout << '0';
else{
carry = 0;
for(i = N, j = 0; i >= 1; i--, j++){
temp = A * i + carry;
carry = temp / 10;
array[j] = temp % 10;
}
if(carry) array[j++] = carry;
for(i = j - 1; i >= 0; i--)
cout << array[i];
}
}
怎么突破常规去思考问题也是很值得思考的一件事情。
本文探讨了一道经典的数列求和问题,并给出了两种不同的实现思路。一种是通过字符串逐个相加的方法,另一种则是利用数学特性进行优化,实现了一次遍历即可完成计算的目标,极大提高了效率。
1293

被折叠的 条评论
为什么被折叠?



