虽然代码写得繁杂了点,但是至少能用。支持包含小数点的大数加减。
#include<stdio.h> #include<stdlib.h> #include<string.h> void add(int num1[50],int num2[50],int i,int j,int a,int b){//加法函数 int change=0;//change用于记录进位 ,如果有进位,change会变为1。 int q,n; int re[60];//用于存放两个大数相加后的值 i=i+a;//忽略小数点,将补位后的小数部分一并算作大数的一部分,i就是这个大数的总位数。 j=j+b; for(n=0;i!=0&&j!=0;n++){ re[n]=num1[i-1]+num2[j-1]+change;//从末尾开始相加 if(i-1==0&&j-1==0)break;//当两个数位数相同时,为了防止有进位后下面步骤会只取到个位,故直接退出 if(re[n]>9){ re[n]=re[n]%10;//有进位的话只取个位 change=1;//进位标识值变为1 } else change=0;//无进位时,标识值变为0 i--; j--; } if(i==0&&j==0){ //由于在前面对开头已经处理好,所以这里不作处理 } else if(i==0){//对于位数不相等时进位的操作 while(j!=0){ re[n]=num2[j-1]+change; if(j-1==0)break;//用意与之前的代码相同 if(re[n]>9){ re[n]=re[n]%10; change=1; } else change=0; j--; n++; } } else if(j==0){ while(i!=0){ re[n]=num1[i-1]+change; if(i-1==0)break; if(re[n]>9){ re[n]=re[n]%10; change=1; } else change=0; i--; n++; } } for(q=n;q>=0;q--){//输出re[]中存的值 if(q==a-1)printf(".");//没有忘记小数点 printf("%d",re[q]); } } /************************************************************************/ //减法 void sub(int num1[50],int num2[50],int i,int j,int a,int b){ int change=0;//进位 int q,n; i=i+a;//忽略小数点,将补位后的小数部分一并算作大数的一部分,i就是这个大数的总位数。 j=j+b; int re[60]; if(i>j){//被减数大于减数时 for(n=0;i!=0&&j!=0;n++){ re[n]=num1[i-1]-change-num2[j-1]; if(re[n]<0){ re[n]=re[n]+10; change=1; } else change=0; i--; j--; } if(j==0){//对于位数不相等时进位的操作 (好像有点多余) while(i!=0){ re[n]=num1[i-1]-change; if(i-1==0)break; if(re[n]<0){ re[n]=re[n]+10; change=1; } else change=0; i--; n++; } } for(q=n;q>=0;q--){ if(q==a-1)printf("."); printf("%d",re[q]); } } else if(i<j){//被减数位数小于减数时 for(n=0;i!=0&&j!=0;n++){ re[n]=num2[j-1]-change-num1[i-1]; if(re[n]<0){ re[n]=re[n]+10; change=1; } else change=0; i--; j--; } if(i==0){//对于位数不相等时进位的操作 while(j!=0){ re[n]=num2[j-1]-change; if(j-1==0)break; if(re[n]<0){ re[n]=re[n]+10; change=1; } else change=0; j--; n++; } } printf("-"); for(q=n;q>=0;q--){ if(q==a-1)printf("."); printf("%d",re[q]); } } else if(i==j){ int k=1;//k用于标识两个数的大小 (赋初值不影响结果,但必须赋个初值,不然两个数相同时会出错) for(n=0;n<i;n++){ if(num1[n]>num2[n]){//第一个数大于第二个数 k=1; break; } else if(num1[n]<num2[n]){//第一个数小于第二个数 k=2; break; } else continue; } if(k==2){ for(n=0;i!=0&&j!=0;n++){ re[n]=num2[j-1]-change-num1[i-1]; if(j-1==0)break; if(re[n]<0){ re[n]=re[n]+10; change=1; } else change=0; i--; j--; } printf("-"); for(q=n;q>=0;q--){ if(q==a-1)printf("."); printf("%d",re[q]); } } else if(k==1){ for(n=0;i!=0&&j!=0;n++){ re[n]=num1[i-1]-change-num2[j-1]; if(i-1==0)break; if(re[n]<0){ re[n]=re[n]+10; change=1; } else change=0; i--; j--; } for(q=n;q>=0;q--){ if(q==a-1)printf("."); printf("%d",re[q]); } } } }//使用减法函数时最后往往会有很多0出现,这个。。。不知道怎么去掉 /**************************************************************************************/ int main() { int num1[50],num2[50],re[60]; int i=0,j=0,a=0,b=0,n,q; char temp;//一个临时的存储变量 printf("请输入第一个大数:"); scanf("%c",&temp); for(i=0;temp!='.'&&temp!='\n';i++){//num1[]数组存储第一个大数 num1[i]=(int)temp-48;//通过强制转换把字符型输入变为整型。 scanf("%c",&temp); } if(temp=='.'){//如果输入了小数点,数组存储小数点后面的数字,用a记录下小数点的位数 scanf("%c",&temp); for(a=0;temp!='\n';a++){ num1[i+a]=(int)temp-48; scanf("%c",&temp); } } printf("请输入第二个大数:"); scanf("%c",&temp); for(j=0;temp!='.'&&temp!='\n';j++){//存储第二个大数 num2[j]=(int)temp-48; scanf("%c",&temp); } if(temp=='.'){//存储小数点后面的数字 scanf("%c",&temp); for(b=0;temp!='\n';b++){ num2[j+b]=(int)temp-48; scanf("%c",&temp); } } if(a<b){//小数点后补位,使两者的小数点位数相同,方便加减 for(q=a+i;q-i<b;q++){ num1[q]=0; } a=b;//更新位数 } else if(b<a){ for(q=b+j;q-j<a;q++){ num2[q]=0; } b=a; } //将补位后的数组连同小数点后的数字看成一个整体 int n1[50],n2[50];//存储大数的绝对值 if(num1[0]==-3&&num2[0]==-3){//当两个数都是负数时,负号的整型值为-3 for(q=0;q<i+a;q++){ n1[q]=num1[q+1];//将输入时的负号忽略,剩下的数按顺序录入一个新数组 } for(q=0;q<j+b;q++){ n2[q]=num2[q+1]; } printf("两个数相加为:"); printf("-"); add(n1,n2,i-1,j-1,a,b); printf("\n"); printf("两个数相减为:"); sub(num2,num1,j,i,a,b); } else if(num1[0]==-3){//当第一个数是负号 for(q=0;q<i+a;q++){ n1[q]=num1[q+1]; } printf("两个数相加为:"); sub(num2,n1,j,i-1,a,b); printf("\n"); printf("两个数相减为:"); printf("-"); add(n1,num2,i-1,j,a,b); } else if(num2[0]==-3){//当第二个数是负号 for(q=0;q<j+b;q++){ n2[q]=num2[q+1]; } printf("两个数相加为:"); sub(num1,n2,i,j-1,a,b); printf("\n"); printf("两个数相减为:"); add(num1,n2,i,j-1,a,b); } else{//都是正数时 printf("两个数相加为:"); add(num1,num2,i,j,a,b); printf("\n"); printf("两个数相减为:"); sub(num1,num2,i,j,a,b); } return 0; }