7-38 数列求和-加强版

本文探讨了一道经典的数列求和问题,并给出了两种不同的实现思路。一种是通过字符串逐个相加的方法,另一种则是利用数学特性进行优化,实现了一次遍历即可完成计算的目标,极大提高了效率。

给定某数字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];
	}
}

怎么突破常规去思考问题也是很值得思考的一件事情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值