zoukankan      html  css  js  c++  java
  • 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)<<":
    ";
    		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;
    }
    
  • 相关阅读:
    使用vue自定义组件以及动态时间
    vue案列
    解决adb devices无法连接夜神模拟器
    手动解除浏览器跨域限制
    HBuilder实现WiFi调试Android
    Spring mvc文件下载
    3大框架Struts、Hibernate、Spring简单了解
    简单了解ajax
    使用本地计划任务定时关闭azure虚拟机
    调整虚拟机的尺寸
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308862.html
Copyright © 2011-2022 走看看