高精度算法-笔记(待完成)
加法
计算 a + b 的值,a,b 皆不超过 10500 位。
读入这种数肯定不能用 int 或 long long,应用 string 或 char[ ] 读入;
接着,将 string 逆序放入 int 类型的数组中;
然后相加(并处理进位);
最后逆序输出。
//高精度加法 #include<bits/stdc++.h> using namespace std; int a[1000001],b[1000001],c[1000001],j; bool x=false; char s[1000001],ss[1000001]; int main() { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c));//初始化 cin>>s>>ss;//读入两个数 a[0]=strlen(s); b[0]=strlen(ss);//获取长度 for(int i=1; i<=a[0]; i++) a[i]=s[a[0]-i]-'0'; for(int i=1; i<=b[0]; i++) b[i]=ss[b[0]-i]-'0';//转化为数字 for(j=1; j<=max(a[0],b[0])+1; j++){ c[j]=a[j]+b[j]; if(c[j]>=10){ c[j]%=10; a[j+1]++; } }//模拟加法 c[0]=j; if(c[j+1]>0) c[0]++;//特判进位 for(int i=c[0]; i>=1; i--){//输出(删除前导零) if(x==false&&c[i]==0) continue; x=true; cout<<c[i]; } if(x==false) cout<<0;//一重保险 cout<<endl;//二重保险 return 0;//三重保险 }
减法
计算 a - b 的值,a,b 皆不超过 1010086 位(a ≥ b)。
先用 string 读入;
接着,逆序存入 int 数组;
然后相减(并处理借位);
最后逆序输出。
//高精度减法
#include<bits/stdc++.h> using namespace std; string a,b;//需要用字符串来储存 int l,l1,c[10005],p;//每一位的差 int main(){ cin>>a>>b; a='0'+a; b='0'+b;//将第0位占0 //假如a<b if(a.size()<b.size()||(a.size()==b.size()&&a<b)){ cout<<'-';//结果为负数,先输出减号 swap(a,b);//交换两个数(例如3-5可以变为0-(5-3)),这样子方便后面计算 } l=a.size(); l1=b.size(); //因为已经确保这时b<a了,所以直接在b前面添0 while(l1<l){ b='0'+b; l1++; }//利用c++的特性让个位对齐 for(int i=1;i<l;i++)c[i]=a[i]-b[i];//计算差 //用来退位,因为可能要多次退位,所以用while循环 while(1){ p=1;//开关,用来看是否需要退位 for(int i=1;i<l;i++){ //需要退位 if(c[i]<0){ c[i-1]--;//向前一位退位 c[i]=10+c[i]; p=0;//开关置零,需要重新复查 } } if(p)break;//不需要退位了,就退出 } p=1; for(int i=1;i<l;i++){ if(c[i]!=0)p=0; if(p==0)cout<<c[i];//特判前导0 } if(p==1)cout<<0;//保险+1 return 0; }

浙公网安备 33010602011771号