杭电oj--1002(高精度加法)

 思路分析:这是杭电上的一道典型的高精度加法运算,以现有的整型数据类型不足以计算如此大的数,不然会导致溢出。

 此题的核心算法是加法运算。

1.先将在屏幕上输入的两个数分别用字符数组(字符串)储存起来

2.然后将这两个数每一位进行对位,长度少的在高位补零,直至相等;为防止最高位有进位,在这两个数的最高位之前再补一个零

3.之后就是将这两个数按位相加,注意进位

4.如果最高位为零则清零

#include<iostream>
#include<string>
using namespace std;
string clear(string a){//清零函数
	if(a.empty()) a="0";
	while(a[0]=='0') a.erase(0,1);
	if(a.empty()) a="0";
	return a;
}
string add(string a,string b){//加法函数
	int i=0,tmp,str=0;
	while(a.length()!=b.length())
		a.length()<b.length() ? a='0'+a:b='0'+b;
	a='0'+a;
	b='0'+b;//对位
	i=a.length();
	while(i--){//逐位相加
		tmp=a[i]-'0'+b[i]-'0'+str;//str用来代表tmp是否大于10,是则进位
		str=tmp/10;
		a[i]=char(tmp%10+'0');用ascll码转成数字字符
	}
	a=clear(a);
	return a;
}
void print(string s3,string s1,string s2,int i,int t){//格式输出
	
	cout<<"Case "<<i<<":"<<endl;
	if(i!=t)
		cout<<s1<<" + "<<s2<<" = "<<s3<<endl<<endl;
	else
		cout<<s1<<" + "<<s2<<" = "<<s3<<endl;
}
int main(){
	string s1,s2,s3;
	int t,lab;
	while(cin>>t){
		lab=t;
		for(int i=1;i<=t;i++){
			cin>>s1>>s2;
			s3=add(s1,s2);
			print(s3,s1,s2,i,lab);
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41048982/article/details/84333248