1. 程式人生 > >杭電oj--1002(高精度加法)

杭電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;
}