学习c++第九记(高精度加法)

因为,这是小学思维就不再多加说明,所以我决定直接贴代码。

其实减法也做了,如果实在没写的了,俺可能就贴出来了(手动秃头)。

这里是定义数字最大为1e240(原题是这样写的),开到了250只是因为,有学长说要有习惯开的数据比题上的数据大一点,可以避免一些麻烦。

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
char a[250] , b[250];//字符串

int main () {
	ll c[250];//数组

	cin >> a >> b;
	
	ll i = strlen (a) - 1 , j = strlen (b) - 1;//得到a,b分别是多少位数,包括前导零
//因为是从最低位开始加,所以即使有前导零,也不会发生错位相加的情况
	ll s = max (i , j);//按最长的那一个数的最后一个位置开始加
	ll n = s , flag = 0;
	while(i >= 0|| j >= 0){
		if(i < 0) {
			c[s] = b[j] - 48 + flag;
			flag = 0;
		}//如果a的位数更多,包括前导零
		else if (j < 0){
			c[s] = a[i] - 48 + flag;
			flag = 0;
		} //如果b的位数更多,包括前导零
		else {
			c[s] = (a[i] - 48) + (b[j] - 48) + flag;
		}
		if(c[s] >= 10){
			c[s] -= 10;
			flag = 1;//如果这一位的数字对应相加超过了10,则记flag为1,方便进位
		}else flag = 0;
		s --;
		i --;
		j --;
		if (i < 0 && j < 0 && flag == 1)cout << flag;//如果最高位相加仍然超过了10的情况
	}
	ll d = 0;
	for(ll k = 0 ; k <= n ; k ++){
		if(c[k] == 0 && d == 0 && flag == 0)continue;//不输出前导零
		else {
			cout << c[k];
			d = 1;//这样可以避免例如,101中间的0不被输出
		}
	}
	return 0;
}

注:这里利用了一下符号数字和数字本身的ASCII码值相差为固定的48。

上一篇:FastAPI作为Windows服务


下一篇:如何发送垃圾邮件?