高精度(加、减、乘、除)

 在位数很大到超过long long的大小的时候需要使用高精度,即使用数组存储数,并模拟数的运算和进位。当然会java,python的可以学一学它自带的函数,十分方便。

 附上加减乘除的代码:

  1 #include<iostream>
  2 #include<string>
  3 using namespace std;
  4 
  5 int compare(string str1,string str2){
  6     int len1=str1.length(),len2=str2.length();
  7     if(len1<len2)
  8         return -1;
  9     else if(len1>len2)
 10         return 1;
 11     else
 12         return str1.compare(str2);
 13 }
 14 
 15 //高精度加法,只能是两个正数相加
 16 string add(string str1,string str2){
 17     string str;
 18     int len1=str1.length(),len2=str2.length();
 19     if(len1<len2)
 20         for(int i=1;i<=len2-len1;i++)
 21             str1="0"+str1;
 22     else
 23         for(int i=1;i<=len1-len2;i++)
 24             str2="0"+str2;
 25     int cf=0,tmp;
 26     len1=str1.length();
 27     for(int i=len1-1;i>=0;i--){
 28         tmp=str1[i]-'0'+str2[i]-'0'+cf;
 29         cf=tmp/10;
 30         tmp%=10;
 31         str=char(tmp+'0')+str;
 32     }    
 33     if(cf)
 34         str="1"+str;
 35     return str;
 36 }
 37 
 38 //高精度减法,只能是两个正数相减,而且要大减小
 39 string sub(string str1,string str2){
 40     string str;    
 41     int len1=str1.length(),len2=str2.length();
 42     for(int i=1;i<=len1-len2;i++)
 43         str2="0"+str2;
 44     int cf=0;
 45     for(int i=len1-1;i>=0;i--){
 46         if(str1[i]-cf>=str2[i]){
 47             str=char(str1[i]-cf-str2[i]+'0')+str;
 48             cf=0;
 49         }
 50         else{
 51             str=char(str1[i]-cf-str2[i]+10+'0')+str;
 52             cf=1;
 53         }
 54     }
 55     str.erase(0,str.find_first_not_of('0'));
 56     if(str.empty())
 57         str="0";
 58     return str;
 59 }
 60 //高精度乘法,只能是两个正数相乘
 61 string mul(string str1,string str2){
 62     string str;
 63     int len1=str1.length(),len2=str2.length();
 64     for(int i=len2-1;i>=0;i--){
 65         string tmpstr;
 66         int tmp=str2[i]-'0',cf=0,t;
 67         if(tmp){
 68             for(int j=1;j<=len2-1-i;j++)
 69                 tmpstr+="0";
 70             for(int j=len1-1;j>=0;j--){
 71                 t=(tmp*(str1[j]-'0')+cf)%10;
 72                 cf=(tmp*(str1[j]-'0')+cf)/10;
 73                 tmpstr=char(t+'0')+tmpstr;
 74             }
 75             if(cf)
 76                 tmpstr=char(cf+'0')+tmpstr;
 77         }
 78         str=add(str,tmpstr);
 79     }
 80     str.erase(0,str.find_first_not_of('0'));  //删除前面多余的0,因为如果是0×10,结果将会是00
 81     if(str.empty())
 82         str="0";
 83     return str;
 84 }
 85 //高精度除法,只能是两个正数相除
 86 void div(string str1,string str2,string& con,string &rem){
 87     if(str2=="0")
 88         return;
 89     else if(str1=="0"){
 90         con="0",rem="0";
 91         return;
 92     }    
 93     else if(compare(str1,str2)<0){
 94         con="0",rem=str1;
 95         return;
 96     }
 97     else if(compare(str1,str2)==0){
 98         con="1",rem="0";    
 99         return;
100     }
101     else{
102         int len1=str1.length(),len2=str2.length();
103         string tmpstr;
104         for(int i=0;i<len2-1;i++)
105             tmpstr=tmpstr+str1[i];
106         for(int i=len2-1;i<len1;i++){
107             tmpstr=tmpstr+str1[i];
108             tmpstr.erase(0,tmpstr.find_first_not_of('0'));
109             if(tmpstr.empty())
110                 tmpstr="0";
111             for(char j='9';j>='0';j--){
112                 string str,tmp;
113                 str=str+j;
114                 tmp=mul(str,str2);
115                 if(compare(tmp,tmpstr)<=0){
116                     con=con+j;
117                     tmpstr=sub(tmpstr,tmp);
118                     break;
119                 }
120             }
121         }
122         rem=tmpstr;
123     }
124     con.erase(0,con.find_first_not_of('0'));
125     if(con.empty())
126         con="0";
127 } 
128 
129 int main(){
130     string str1,str2,con,rem;
131     cin>>str1>>str2;
132     div(str1,str2,con,rem);
133     cout<<con<<endl<<rem<<endl;
134     return 0;
135 }

猜你喜欢

转载自www.cnblogs.com/FrankChen831X/p/10340221.html
今日推荐