题目:一般数的加减乘除很好计算,如果超过了8为数,那么int就无能为力了。以前老是让做过大数的加法,但那时年少无知,没有去做,貌似当时的作业都没完成。这几天心血来潮,对着个问题有感兴趣。当然这是编程路上必须走的路。下面就献上我的代码。
分析:
大数的运算,说大数,那就不能用简单的数据类型能解决的。我想到的是用数组存储数据。
大概思路:说先义字符的形式把数输入到数组中,然后在将字符数组转换成整型的。然后对这些书进行操作。
比较大小:这个简单,把数组的每一位(从高到低)进行比较就行了。
加法:将每一位进行相加,有进位的进行进位,后面相加时要加上进位。没有进位的直接就加起来。如果位数相等,直接相加就好了,如果位数不等,则把多余的部分直接放在结果中。
加法:从最低位开始,将每以为相对的进行相减,如果见不过还要向前面借位。
除法和乘法还没做完,以后补上。
代码不够简洁,有更好的代码的,可以拿来进行分享。
下面就是代码:
#define MAX 1000
#include<stdio.h>
void add(int *a,int *b,int nNuma,int nNumb);
void plus(int *a,int *b,int nNuma,int nNumb);
bool compare(int *a,int *b,int nNuma,int nNumb);
int main()
{
int nNuma,nNumb;
nNuma=0; nNumb=0;
int i;
char c1,c2;
char a1[MAX],b1[MAX];
int a[MAX],b[MAX];
printf("请输入第一个数\n");
for(i=0;;i++)
{
nNuma++;
scanf("%c",&c1);
a1[i]=c1;
if(c1=='\n')
{ nNuma--;
break;
}
}
printf("请输入第二个数\n");
for(i=0;;i++)
{
nNumb++;
scanf("%c",&c2);
b1[i]=c2;
if(c2=='\n')
{ nNumb--;
break;
}
}
for(i=0;i<nNuma;i++)
{
a[i]=a1[i]-'0';
}
for(i=0;i<nNumb;i++)
{
b[i]=b1[i]-'0';
}
add(a,b,nNuma,nNumb);
if(compare(a,b,nNuma,nNumb))
printf("a>=b\n");
else
printf("a<b\n");
plus(a,b,nNuma,nNumb);
return 0;
}
//大数减法
void plus(int *a,int *b,int nNuma,int nNumb)
{ int i,h;
int k=0;
int c[MAX];
//int ma[MAX];
int na,nb;
int *ma;
int *mb;
na=nNuma;
nb=nNumb;
ma=a;
mb=b;
if(!compare(a,b,nNuma,nNumb))
{
ma=b;
mb=a;
na=nNumb;
nb=nNuma;
}
for(;nb-1>=0;na--,nb--)
{
if(ma[na-1]<mb[nb-1])
{
ma[na-2]--;
h=10;
}
else
h=0;
c[k]=ma[na-1]-mb[nb-1]+h; //h为借位
k++;
}
if(ma[na-1]<mb[nb-1])
{
ma[na-2]--;
h=10;
}
else
h=0;
if(na-1>=0)
{
for(i=nb-1;i>=0;k++,i--)
c[k]=ma[i];
}
printf("差为: ");
if(!compare(a,b,nNuma,nNumb));
else
printf("-");
for(int j=k-1;j>=0;j--)
printf("%d",c[j]);
printf("\n");
}
//大数加法
void add(int *a,int *b,int nNuma,int nNumb)
{
int i,h,t; h=0;
int k=0;
int c[MAX];
int na=nNuma;
int nb=nNumb;
for(;na-1>=0&&nb-1>=0;na--,nb--)
{
t=a[na-1]+b[nb-1]+h;
c[k]=t%10;
h=t/10;
k++;
}
if(t>=10)
h=t/10;
else
h=0;
if(na==nb)
{
c[k]=h;k++;
}
if(na-1>=0)
{
for(i=na-1;i>=0;k++,i--)
{ c[k]=a[i]+h;
h=0; }
}
if(nb-1>=0)
{
for(i=nb-1;i>=0;k++,i--)
{ c[k]=b[i]+h;
h=0;
}
}
printf("差为: ");
for(int j=k-1;j>=0;j--)
printf("%d",c[j]);
printf("\n");
}
bool compare(int *a,int *b,int nNuma,int nNumb)
{
int i=0;
bool sign;
int na=nNuma;
int nb=nNumb;
if(na>nb)
sign=true;
else if(na==nb)
{ while(a[i]==b[i])
i++;
if(a[i]<b[i]) sign=false; //a[]小于b[]
else sign=true;
}
else if(na<nb) //nb>na
sign=false;
return sign;
}