当数的范围超出long long int的范围时,如果要进行比较和加减我们就要用到大数
大数的比较和加法
大数的加法
因为大数超出了long long int的范围,我们可以用两个字符数组来存放大数,然后模拟人工运算(从最后一位开始,相加然后进位),下面给出代码
#include<stdio.h>
#include<string.h>
int main()
{
char a[10000],b[10000],q; //用两个字符数组来存放数据
scanf("%s",a); //输入两串数字
scanf("%s",b);
int i,j,n,m;
m=strlen(a);
n=strlen(b);
if(m<=n)
{
for(i=n+1,j=m;j>=0;j--,i--) //要进行加法,先要在短的那串数字前面补0,让两串数据等长
{
a[i]=a[j];
}
for(i=0;i<=n-m;i++)
{
a[i]='0';
}
for(i=n;i>=0;i--) //两个数相加,须让长的数据前多一个0来存放可能的进位
{
b[i]=b[i-1];
}
b[0]='0';
}
else
{
for(i=m+1,j=n;j>=0;j--,i--)
{
b[i]=b[j];
}
for(i=0;i<=m-n;i++)
{
b[i]='0';
}
for(i=m;i>=0;i--)
{
a[i]=a[i-1];
}
a[0]='0';
n=m; //让n=最长的字符串长度
}
q=0; //初始化用来统计进位的变量q
for(i=n;i>=0;i--)
{
m=a[i]+b[i]-'0'-'0'+q; //因为是以字符串形式来存放,减去‘0’后才是要运算的数字
a[i]=m%10+'0';
q=m/10;
}
if(a[0]!='0') //去除可能的前导0
printf("%c",a[0]);
for(i=1;i<=n;i++)
{
printf("%c",a[i]);
}
return 0;
}
输入
9999999999999999999999
9999999999999999999999
运行结果:
大数的比较
要比较两个大数,可以先比较位数,位数大的数字一定大。如果位数相同则从最高位开始比较。
下面是代码(输出较大的数):
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int bj(char *,char *);
int main()
{
int i,n,q,w=1;
char a[10000]; //同样用两个字符数组存放数字
char b[10000];
scanf("%s",a);
scanf("%s",b);
q=bj(a,b);
if(q)
{
strcpy(a,b); //如果b>a,把b复制给a
}
printf("%s",a);
return 0;
}
int bj(char *x,char *y) //如果a>b返回0,否则返回1
{
int a,b,i;
a=strlen(x);
b=strlen(y);
if(a>b)
return 0;
if(a<b)
return 1;
if(a==b)
{
for(i=0;i<a;i++)
{
if(x[i]>y[i])
return 0;
else if(x[i]==y[i])
continue;
else
return 1;
}
}
return 0;
}
输入
9999999999999999999999999999999999999999999999999999999999999999999988
9999999999999999999999999999999999999999999999999999999999999999999987
运行结果: