(模板) 高精度(加、减、乘、除)
在位数很大到超过long long的大小的时候需要使用高精度,即使用数组存储数,并模拟数的运算和进位。当然会java,python的可以学一学它自带的函数,十分方便。
附上加减乘除的代码:
#include<iostream> #include<string> #include<algorithm> #include<cmath> #include<cstring> #include<cstdlib> using namespace std; int compare(string str1,string str2){ int len1=str1.length(),len2=str2.length(); if(len1<len2) return -1; else if(len1>len2) return 1; else return str1.compare(str2); } //高精度加法,只能是两个正数相加 string add(string str1,string str2){ string str; int len1=str1.length(),len2=str2.length(); if(len1<len2) for(int i=1;i<=len2-len1;i++) str1="0"+str1; else for(int i=1;i<=len1-len2;i++) str2="0"+str2; int cf=0,tmp; len1=str1.length(); for(int i=len1-1;i>=0;i--){ tmp=str1[i]-'0'+str2[i]-'0'+cf; cf=tmp/10; tmp%=10; str=char(tmp+'0')+str; } if(cf) str="1"+str; return str; } //高精度减法,只能是两个正数相减,而且要大减小 string sub(string str1,string str2){ string str; int len1=str1.length(),len2=str2.length(); for(int i=1;i<=len1-len2;i++) str2="0"+str2; int cf=0; for(int i=len1-1;i>=0;i--){ if(str1[i]-cf>=str2[i]){ str=char(str1[i]-cf-str2[i]+'0')+str; cf=0; } else{ str=char(str1[i]-cf-str2[i]+10+'0')+str; cf=1; } } str.erase(0,str.find_first_not_of('0')); if(str.empty()) str="0"; return str; } //高精度乘法,只能是两个正数相乘 string mul(string str1,string str2){ string str; int len1=str1.length(),len2=str2.length(); for(int i=len2-1;i>=0;i--){ string tmpstr; int tmp=str2[i]-'0',cf=0,t; if(tmp){ for(int j=1;j<=len2-1-i;j++) tmpstr+="0"; for(int j=len1-1;j>=0;j--){ t=(tmp*(str1[j]-'0')+cf)%10; cf=(tmp*(str1[j]-'0')+cf)/10; tmpstr=char(t+'0')+tmpstr; } if(cf) tmpstr=char(cf+'0')+tmpstr; } str=add(str,tmpstr); } str.erase(0,str.find_first_not_of('0')); //删除前面多余的0,因为如果是0×10,结果将会是00 if(str.empty()) str="0"; return str; } //高精度除法,只能是两个正数相除 void div(string str1,string str2,string& con,string &rem){ if(str2=="0") return; else if(str1=="0"){ con="0",rem="0"; return; } else if(compare(str1,str2)<0){ con="0",rem=str1; return; } else if(compare(str1,str2)==0){ con="1",rem="0"; return; } else{ int len1=str1.length(),len2=str2.length(); string tmpstr; for(int i=0;i<len2-1;i++) tmpstr=tmpstr+str1[i]; for(int i=len2-1;i<len1;i++){ tmpstr=tmpstr+str1[i]; tmpstr.erase(0,tmpstr.find_first_not_of('0')); if(tmpstr.empty()) tmpstr="0"; for(char j='9';j>='0';j--){ string str,tmp; str=str+j; tmp=mul(str,str2); if(compare(tmp,tmpstr)<=0){ con=con+j; tmpstr=sub(tmpstr,tmp); break; } } } rem=tmpstr; } con.erase(0,con.find_first_not_of('0')); if(con.empty()) con="0"; } bool JudgeZero(string s1){ for(int i=0;i<s1.length();++i) if(s1[i]!='0') return false; return true; } string gcd(string a,string b){ if(!JudgeZero(b)){ string s1,s2; div(a,b,s1,s2); return gcd(b,s2); } return a; } string lcm(string a,string b){ string t=gcd(a,b),s1,s2; a=mul(a,b); div(a,t,s1,s2); return s1; }
朋友们,无论这个世界变得怎样,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。