什么是大数
我们要进行大数的基本运算,必须先搞清楚什么样的数是大数,所谓大数就是指一些位数特别大,几百上千位数的这种数字。因为这些数的值超过了,int,long等基本数据类型。所以用基本的数据类型无法直接比较,这时我们就需要别的计算方法了。
大数相加
前面我们提到了大数的数据类型超过了基本的int,long,所以我们的解题方法就是将大数先按char类型表示,然后再进行相加。
代码如下
#include<stdio.h>
#include<string.h>
int main()
{
int t, m;
scanf("%d",&t);
getchar();
char s1[1020],s2[1020];
int a[1020],b[1020];
int sum[1020];
int i, j, k, flag, len1, len2, temp, count;
for(m = 1; m <= t; m++)
{
scanf("%s",s1);
scanf("%s",s2);
len1 = strlen(s1);
len2 = strlen(s2);
flag = 1;
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(sum, 0, sizeof(sum));
for(i = len1 - 1, k = 0; i >= 0; i--)
{
a[k++] = s1[i]-'0';
}
for(i = len2 - 1, k = 0;i >= 0; i--)
{
b[k++] = s2[i]-'0';
}
for(i = 0,count = 0;i < len1 || i < len2; i++)
{
temp = a[i] + b[i] + count;//进位
sum[i] = temp % 10;
count = temp / 10;
}
printf("%d\n",m);
printf("%s + %s = ",s1,s2);
flag = 0;
for(k = i; k >= 0; k--)
{
if(sum[k] != 0)//排除0008 +2=0010这样的情况,正确输出10,而不是0010
flag = 1;
if(flag == 1)
printf("%d",sum[k]);
}
if(flag == 0)
printf("0");
printf("\n");
if(m != t)
{
printf("\n");
}
return 0;
}
大数相乘
大数相乘的基本思路和大数相加基本相似,我们还是需要将大数先用字符串数组储存,因为各个位相乘出来的积都是比原来位的最多多一倍,所以我们将储存结果的数组大小为原本的两倍。
代码如下:
#include<stdio.h>
#include<string.h>
#define MAX 100
char a[MAX],b[MAX];
int x[MAX+10],y[MAX+10],z[MAX*2+10];
int main()
{
int len1, len2, i, j;
while (scanf("%s %s",a,b))
{
len1 = strlen(a);
len2 = strlen(b);
for (j = 0, i = len1 - 1; i >=0 ; i--)
x[j++] = a[i] - '0';
for (j = 0,i = len2 - 1; i >= 0; i--)
y[j++] = b[i] - '0';
for (i = 0; i < len1; i++)
{
for (j = 0; j < len2 ; j++)
z[i + j] = z[i + j] + x[i] * y[j];
}
for (i = 0; i < MAX * 2; i++)
{
if (z[i] >= 10)
{
z[i + 1] = z[i + 1] + z[i] / 10;
z[i] = z[i] % 10;
}
}
for (i = MAX * 2; i > 0; i--) //删除0的前缀
{
if (z[i] == 0)
{
continue;
}
else
break;
}
for ( ; i >= 0; i--) //倒序输出
printf("%d ",z[i]);
printf("\n");
}
return 0;
}
这就是我们最常见的大数相加与大数相乘。