HDU 1002 A + B Problem II

思路:

1.用字符串来存储大数;
2.判断两个数的正负性;
3.按位相加存储在数组中,然后判断和的正负性;
4.根据和的正负分别对每位进行处理;
5.记得处理和为0的情况;

代码:

#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
vector<int> v;
int main(){
	int t,kase=0;
	cin>>t;
	while(t--){
		cout<<"Case "<<(++kase)<<":\n";
		string a,b; //数字过大超出int范围 
		cin>>a>>b;
		cout<<a<<" + "<<b<<" = ";
		v.clear();
		int a_sign=1,b_sign=1,a_len=a.length(),b_len=b.length();
		if(a[0]=='-'){//判断正负性 
			a_sign=-1;
			a_len--;
		}
		if(b[0]=='-'){
			b_sign=-1;
			b_len--;
		}
		int max_len=max(a_len,b_len);
		v.resize(max_len+1);
		for(int i=0;i<max_len;i++){
			int x=(i<a_len?a_sign*(a[a.length()-i-1]-'0'):0);
			int y=(i<b_len?b_sign*(b[b.length()-i-1]-'0'):0);
			v[i]=x+y;
		}
		int sign=0;//通过最高位的正负性来判断和的正负性 
		for(int i=max_len;i>=0;i--){
			if(v[i]){
				sign=v[i]>0?1:-1;
				break;
			}
		}	
		for(int i=0;i<=max_len&&sign;i++){
			if(v[i]>9&&sign>0){
				v[i+1]++;
				v[i]-=10;
			}else if(v[i]>0&&sign<0){
				v[i]=10-v[i];
				v[i+1]++;
			}else if(v[i]<0&&sign>0){
				v[i]+=10;
				v[i+1]--;
			}else if(v[i]<0&&sign<0){
				v[i]*=-1;
				if(v[i]>9){v[i]-=10;v[i+1]--;}
			}
		}
		if(sign==-1) putchar('-');
		int pos=max_len;
		while(!v[pos]) pos--;
		while(pos>=0) putchar(v[pos--]+'0');
		puts(sign?"":"0");//和可能为0 
		if(t) puts(""); 
	}
	return 0;
}
posted @ 2019-11-17 15:34  YuhanのBlog  阅读(94)  评论(0编辑  收藏  举报