分析

首先,题意就是给出$n$个数,从左到右进行加法计算,不过这个计算需要按照特殊规则。这样,我们第一个条件就分析完了。

接下来是第二个条件,“若两个数的位数不同,则位数少的数自动在前面补前导零,直到两数位数相同。”本蒟蒻嗅到一丝平常高精的气息,便突发奇想。

然后第三和第四个条件则可以理解为高精的进位规则,只要会压位的童鞋这个转化起来都没什么问题。

第三个条件:从两个数的最低位开始,计算当前位两个数码的和加上前一位的进位,写上这个和除以 $10$ 的余数。 显然这就是正常的十进制运算的规则。

第四个条件:进位规则:如果当前位两个数码的和加上前一位的进位小于 $7$,不进位;如果和大于等于 $7$ 且小于等于 $13$,则进一位;否则进两位。 所以只需要根据这个进位条件写一个条件语句即可。

示例代码:

#include <iostream>
#include <cstring>		//判断字符串长度需要用到
using namespace std;
int n;
int sum[100005];		//该数组储存当前答案
int tmp[100005];		//该数组则储存最新要被操作的数
long long a;			//中间变量,用来输入数字并将其转换为高精度数
long long sumlen;		//可以用int,是用来储存sum这个数的长度,高精度必备
long long tmplen;		//同上
int main(){
	cin>>n;
	cin>>a;
	while(a!=0){
		sum[++sumlen]=a%10;
		a/=10;
	}
	//sum倒序存储 
	for(long long i=2;i<=n;i++){
		tmplen=0;
		for(int i=1;i<=10;i++)tmp[i]=0;			//要先将tmp置空,否则会出错
		cin>>a;
		while(a!=0){
			tmp[++tmplen]=a%10;
			a/=10;
		}										//将新读入的数转化到tmp里面
		int x;									//x代表进位
		for(long long j=1;j<=tmplen || j<=sumlen;j++){
			x=0;
			sum[j]+=tmp[j];
			if(sum[j]<7)continue;				//如果第j位相加后还小于7,则不用进位,进入下层循环
			else if(sum[j]>=7 && sum[j]<=13)x=1,sum[j]%=10;	//条件4
			else x=2,sum[j]%=10;							//条件4
			sum[j+1]+=x;									//下一位进位
		}
		sumlen=max(tmplen,sumlen)+1;				//先假设最高位进位了
		while(sumlen!=0 && sum[sumlen]==0)sumlen--;	//如果没进位,则到退回来
	}
	for(long long i=sumlen;i>=1;i--)
	cout<<sum[i];
   //输出答案,完美结束
	return 0;
} 

如有错误还望指出,蟹蟹

发表评论

邮箱地址不会被公开。