高精度算法
一、高精度加法
1、计算结果的位数
2、将要计算的数字分割成多段,按照顺序排列
3、将两数相加。
4、输出结果。
从高位到低位依次输出。除最高位以外,其他低位上不足4位的要在前面补上0。
核心代码:
int c[100]; //a,b,c都为数组(可用字符数组),分别储存被加数、加数、结果 void add(int a[],int b[]) { int i=1,x=0; while((i<=a数组长度)||(i<=b数组的长度)) { c[i]=a[i]+b[i]+x;//第i位相加并加上次的进位 x=c[i]/10;//向高位进位 c[i]%=10;//储存第i位的值 i++; //位置下标变量 } }
源代码:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int maxn=1010; char a1[maxn],b1[maxn]; int a[maxn],b[maxn],c[maxn]; int a1_len,b1_len,lenc,x; int main() { //freopen("file.in","r",stdin); //freopen("file.out","w",stdout); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); gets(a1); gets(b1);//输入加数与被加数 a1_len=strlen(a1); b1_len=strlen(b1); for(int i=0;i<=a1_len-1;i++) a[a1_len-i]=a1[i]-48;//放入a for(int i=0;i<=b1_len-1;i++) b[b1_len-i]=b1[i]-48;//放入b lenc=1; x=0; while((lenc<=a1_len)||(lenc<=b1_len)) { c[lenc]=a[lenc]+b[lenc]+x;//第i位相加并加上次的进位 x=c[lenc]/10;//向高位进位 c[lenc]%=10;//储存第i位的值 lenc++; //位置下标变量+1 } c[lenc]=x; if(c[lenc]==0) lenc--;//最高位 for(int i=lenc;i>=1;i--) cout<<c[i];//结果 printf("\n"); fclose(stdin); fclose(stdout); return 0; }
二、高精度减法
从键盘读入两个正整数,求他们的差
【分析】:类似加法,可以用竖式求减法
【需要注意的是】;被减数必须比减数大,同时需要处理借位
因此…
源代码:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int maxn=1010; char n1[maxn],n2[maxn],n[maxn]; int a[maxn],b[maxn],c[maxn]; int lena,lenb,lenc,x; int main() { // freopen("file.in","r",stdin); // freopen("file.out","w",stdout); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); int i; gets(n1); gets(n2);//输入被减数与减数 if (strlen(n1)<strlen(n2)||(strlen(n1)==strlen(n2)&&strcmp(n1,n2)<0)) { //strcmp()为字符串比较函数,如果n1==n2,返回0 //如果n1>n2,返回正整数,如果n1<n2,返回负整数 strcpy(n,n1); //判断被减数和减数的大小,交换减数和被减数 strcpy(n1,n2); strcpy(n2,n); cout<<"-"; //交换之后的数据,结果为负数 } lena=strlen(n1); lenb=strlen(n2); for(i=0;i<=lena-1;i++) a[lena-i]=n1[i]-'0';//放入a for(i=0;i<=lenb-1;i++) b[lenb-i]=n2[i]-'0';//放入b i=1; while(i<=lena) { if(a[i]<b[i]) { a[i]+=10;//借位 a[i+1]--;//上一位减一 } c[i]=a[i]-b[i];//对应位相减 i++; } i--; int j; for(j=i;j>=2;j--) { if(c[j]!=0) break; } for(;j>=2;j--) cout<<c[j]; cout<<c[1]; cout<<endl; fclose(stdin); fclose(stdout); return 0; }
…调减法代码调到天荒地老终于过了
…信竞班还有A+B的题等着我去解决QAQ
…蒟蒻也要努力