虽然代码写得繁杂了点,但是至少能用。支持包含小数点的大数加减。
#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;
}