//高精度数值比较、加法、减法、乘法、除法 #include<bits/stdc++.h> #include<iostream> using namespace std; struct bign{ int d[1000]; int len; bign(){ //构造函数(初始化数组) memset(d,0,sizeof(d)); len=0; } }a,b; bign change(char str[]) { bign a; a.len=strlen(str); for(int i=0;i<a.len;i++) a.d[i]=str[a.len-i-1]-'0'; return a; } int cmp(bign a,bign b) { if(a.len>b.len) return 1; //a更大 else if(a.len<b.len) return -1; //b更大 else { //如果两个大整数的位数相同,比较每一位 for(int i=a.len-1;i>=0;i--) { if(a.d[i]>b.d[i]) return 1; else if(a.d[i]<b.d[i]) return -1; } return 0;//两数相等 } } bign add(bign a,bign b) { bign c; int carry=0;//进位 for(int i=0;i<a.len||i<b.len;i++) { int temp=a.d[i]+b.d[i]+carry; c.d[c.len++]=temp%10; carry=temp/=10; } if(carry!=0) c.d[c.len++]=carry; return c; } bign sub(bign a,bign b) { bign c; for(int i=0;i<a.len||i<b.len;i++) { if(a.d[i]<b.d[i])//不够减的时候 { a.d[i+1]--;//高位借位给这一位 a.d[i]+=10;//这一位+10 } c.d[c.len++]=a.d[i]-b.d[i]; } while(c.len-1>=1&&c.d[c.len-1]==0) c.len--; //除去最高位的0,同时至少保留一位最低位 return c; } bign multi(bign a,int b) { bign c; int carry=0; for(int i=0;i<a.len;i++) { int temp=a.d[i]*b+carry; c.d[c.len++]=temp%10; carry=temp/10; } while(carry!=0) { c.d[c.len++]=carry%10; carry/=10; } return c; } bign divide(bign a,int b) { bign c; int r=0; c.len=a.len; for(int i=a.len-1;i>=0;i--) { r=r*10+a.d[i]; if(r<b) c.d[i]=0; else { c.d[i]=r/b; r=r%b; } } while(c.len-1>=1&&c.d[c.len-1]==0) c.len--; return c; } int main(int argc,char **argv){ char str1[1000],str2[1000]; printf("请输入第一个大数a:\n"); cin.getline(str1,1000);//也可以用scanf("%s",str1)来读,区别就是scanf不读空格,空格即停止 printf("请输入第二个大数b:\n"); cin.getline(str2,1000); puts("结果为:"); bign a=change(str1); bign b=change(str2); /************加法************/ // bign c=add(a,b); // for(int i=c.len-1;i>=0;i--) // { // printf("%d",c.d[i]); // } /************减法************/ // if(cmp(a,b)>0) // { // bign c=sub(a,b); // for(int i=c.len-1;i>=0;i--) // { // printf("%d",c.d[i]); // } // } // // else if(cmp(a,b)<0) // { // bign c=sub(b,a); // printf("-"); // for(int i=c.len-1;i>=0;i--) // { // printf("%d",c.d[i]); // } // } // else if(cmp(a,b)==0) // { // printf("0"); // } /************乘法************/ // int s; // scanf("%d",&s); // bign c=multi(a,s); // for(int i=c.len-1;i>=0;i--) // { // printf("%d",c.d[i]); // } /************除法************/ // int z; // scanf("%d",&z); // bign c=divide(a,z); // for(int i=c.len-1;i>=0;i--) // { // printf("%d",c.d[i]); // } return 0; }
高精度比较,加法,减法,乘法,除法template
于 2023-04-18 22:24:30 首次发布