首页 > 代码库 > 利用C++ string实现任意长度小数、整数之间的加法

利用C++ string实现任意长度小数、整数之间的加法

  1 /*  2 大数的运算1--加法:  3 利用C++ string实现任意长度小数、整数之间的加法  4 作者:大大维  5 2017/5/5  6 */  7 #include<iostream>  8 #include<string>  9 #include<cctype> 10 #include<algorithm> 11 using namespace std; 12 int main() 13 { 14     string num1,num2; 15     cout<<"Input num1 , num2:"<<endl; 16     cin>>num1>>num2; 17     string num11,num12,num21,num22; 18     //输入检查 19     int tempCnt=0; 20     for(auto c:num1) 21     { 22         if(!isdigit(c)||num1.empty()) 23         { 24             if(c==.&&tempCnt!=1) 25             { 26                 ++tempCnt; 27             } 28             else 29             { 30                 cout<<"num1: Please input correct form!!!"<<endl; 31                 return 0; 32             } 33         } 34     } 35     tempCnt=0; 36     for(auto c:num2) 37     { 38         if(!isdigit(c)||num2.empty()) 39         { 40             if(c==.&&tempCnt!=1) 41             { 42                 ++tempCnt; 43             } 44             else 45             { 46                 cout<<"num2: Please input correct form!!!"<<endl; 47                 return 0; 48             } 49         } 50     } 51  52     //字符串分割(整数部分和小数部分) 53     int i=0; 54     while(i!=num1.size()&&num1[i]!=.) 55     { 56         num11+=num1[i]; 57         ++i; 58     } 59     while(++i!=num1.size()) 60     { 61         num12+=num1[i]; 62     } 63     i=0; 64     while(i!=num2.size()&&num2[i]!=.) 65     { 66         num21+=num2[i]; 67         ++i; 68     } 69     while(++i!=num2.size()) 70     { 71         num22+=num2[i]; 72     } 73     if(num11.empty()) 74         num11+=0; 75     if(num12.empty()) 76         num12+=0; 77     if(num21.empty()) 78         num21+=0; 79     if(num22.empty()) 80         num22+=0; 81  82  83     //小数部分计算 84     string &strLong2=num12,&strShort2=num22; 85     if(strLong2.size()<strShort2.size()) 86     { 87         string strTemp=strLong2; 88         strLong2=strShort2; 89         strShort2=strTemp; 90     } 91     //补0 92     for(int i=strShort2.size();i<strLong2.size();++i) 93         strShort2+=0; 94     //反转字符串 95     reverse(strLong2.begin(),strLong2.end()); 96     reverse(strShort2.begin(),strShort2.end()); 97     //小数部分进行加法计算 98     string strRes2(strLong2.size(),0); 99     int carry=0;//进位100     for(int i=0;i!=strLong2.size();++i)101     {102         int a=strShort2[i]-0,b=strLong2[i]-0;103         a=a+b+carry;104         carry=a/10;105         strRes2[i]=(a%10)+0;106     }107     //反转回来108     reverse(strRes2.begin(),strRes2.end());109 110 111     //整数部分计算112     //反转字符串113     string &strLong1=num11,&strShort1=num21;114     if(strLong1.size()<strShort1.size())115     {116         string strTemp=strLong1;117         strLong1=strShort1;118         strShort1=strTemp;119     }120     reverse(strLong1.begin(),strLong1.end());121     reverse(strShort1.begin(),strShort1.end());122 123 124     string strRes1(strLong1.size(),0);125     for(int i=0;i!=strShort1.size();++i)126     {127         int a=strShort1[i]-0,b=strLong1[i]-0;128         a=a+b+carry;129         carry=a/10;130         strRes1[i]=(a%10)+0;131     }132     for(int i=strShort1.size();i!=strLong1.size();++i)133     {134         int b=strLong1[i]-0;135         b+=carry;136         carry=b/10;137         strRes1[i]=b%10+0;138     }139     if(carry)140     {141         strRes1+=(carry+0);142     }143     //反转回来144     reverse(strRes1.begin(),strRes1.end());145 146 147     //合并整数部分和小数部分148     string strRes=strRes1+.+strRes2;149     cout<<"The result = "<<strRes<<endl;150 }

 

利用C++ string实现任意长度小数、整数之间的加法