//高精度、大整数 加、减、乘、除(只涉及大整数除以小整数) /* 策略1:输入处理,采用字符串【长度不限,可以整体存,单字符操作】 策略2:计算 加法:倒序,转int类型,进行加法,通过数字拆分进位,最后得出结果存放 减法:保证被减数大,倒序,转int类型,进行减法,通过数字拆分借位,最后得出结果存放 除法:不需要倒序,按位进行整除取余,通过数字拼接继位,最后得出结果存放 策略3:结果处理 加法:倒序,去除多余的零(前导零) 减法:加上符号,倒序,去除多余的零(前导零) 除法:可能计算商和余数 */ #include <iostream> #include <algorithm> using namespace std; //输入一个长度小于200的大整数,输出它的相反数 string xfs(string s){ if(s[0]=='-') return s.substr(1,s.size()-1); else if(s=="0") return s; else return "-"+s; } //输入两个长度小于200的大整数,输出它们的和,0000003465070643 string add(string s1,string s2){ if(s1.size()<s2.size()) swap(s1,s2); reverse(s1.begin(),s1.end()); reverse(s2.begin(),s2.end()); string ans=""; int n=0,jw=0; for(int i=0;i<s1.size();i++){ n=s1[i]-48+jw; if(i<s2.size()) n+=s2[i]-48; jw=n/10; ans+=to_string(n%10); } if(jw) ans+=to_string(jw); int i=ans.size()-1; while(ans[i]=='0'&&i!=0) i--; ans=ans.substr(0,i+1); reverse(ans.begin(),ans.end()); return ans; } //输入两个长度小于200的大整数,输出它们的差 string sub(string s1,string s2){ string sign=""; if(s1.size()<s2.size()||s1.size()==s2.size()&&s1<s2){ swap(s1,s2); sign="-"; } reverse(s1.begin(),s1.end()); reverse(s2.begin(),s2.end()); string ans=""; int n=0; for(int i=0;i<s1.size();i++){ n=s1[i]-48; if(i<s2.size()) n-=s2[i]-48; if(n<0){ n+=10; s1[i+1]--; } ans+=to_string(n); } int i=ans.size()-1; while(ans[i]=='0'&&i!=0) i--; ans=ans.substr(0,i+1); reverse(ans.begin(),ans.end()); return sign+ans; } //除法:高精度除以低精 struct Ans{ string shang; int ys; }; Ans dev(string s,int a){ int ys=0; string ans=""; for(int i=0;i<s.size();i++){ ys=ys*10+s[i]-48; if(ys<a) ans+="0"; else { ans+=to_string(ys/a); ys%=a; } } int i=0; while(ans[i]=='0'&&i!=ans.size()-1) i++; ans=ans.substr(i); Ans p={ans,ys}; return p; } int main(){ string s="1234567"; int a=7; Ans p=dev(s,a); cout<<p.shang<<" "<<p.ys; return 0; } (责任编辑:admin) |