高精度(加减乘除)
Posted frankchen831x
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度(加减乘除)相关的知识,希望对你有一定的参考价值。
在位数很大到超过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 }
以上是关于高精度(加减乘除)的主要内容,如果未能解决你的问题,请参考以下文章