一、简介:
我们知道,C语言中的整型有short、int、long。ANSI C标准定义的整数类型范围为:
类型 | 比特数 | 取值范围 |
unsigned short int | 16 | 0至65535(0至2^16-1) |
signed short int | 16 | -32768至32767(-2^15至2^15-1) |
unsigned int | 16 | 0至65535(0至2^16-1) |
signed int | 16 | -32768至32767(-2^15至2^15-1) |
unsigned long | 32 | 0至4294967295(0至2^32-1) |
signed long | 32 | -2147483648至2147483647(-2^31至2^31-1) |
在C程序设计中,无法用两个很大的整数进行相加、相乘操作,否则会出现数据溢出。未解决这一困局,可用字符串来模拟大整数运算。
二、大整数相加
#include <stdio.h>
#include <string.h>
#define N 10000
void Convert(char *, int);
void AddZero(char *, int, int);
int main()
{
int i, alen, blen, mlen, c[N+1]={0}, zflag=0;
char a[N], b[N];
printf("input:\n");
gets(a);
gets(b);
alen = strlen(a);
blen = strlen(b);
Convert(a, alen);
Convert(b, blen);
if (alen > blen)
{
mlen = alen;
AddZero(b, blen, alen);
}
else
{
mlen = blen;
AddZero(a, alen, blen);
}
for (i=0; i<mlen; i++)
c[i+1] = a[i] + b[i];
for (i=0; i<mlen; i++)
if (c[i+1]>9)
{
c[i] += c[i+1]/10;
c[i+1] %= 10;
}
printf("result:\n");
i = 0;
while(1)
if (c[i++])
break;
else
zflag++;
for (i=zflag; i<mlen+1; i++)
printf("%d", c[i]);
printf("\n");
return 0;
}
void Convert(char *p, int len)
{
for(int i=0; i<len; i++)
*(p+i) -= '0';
}
void AddZero(char *p, int len1, int len2)
{
for(int i=len1-1; i>=0; i--)
*(p+i+(len2-len1)) = *(p+i);
for (i=0; i<len2-len1; i++)
*(p+i) = 0;
}
三、大数相乘
#include <stdio.h>
#include <string.h>
#define N 100
void Multiply(char [N], char [N]);
int main()
{
char a[N], b[N];
printf("input:\n");
gets(a);
gets(b);
printf("result:\n");
Multiply(a, b);
return 0;
}
void Multiply(char a[N], char b[N])
{
int i, j, k, alen, blen, c[2*N+1]={0}, cflag;
alen = strlen(a);
blen = strlen(b);
for (i=0; i<alen; i++)
a[i] -= '0';
for (j=0; j<blen; j++)
b[j] -= '0';
for (i=alen-1; i>=0; i--)
for (j=blen-1; j>=0; j--)
c[i+j+1] = a[i]*b[j];
for (k=1; k<alen+blen+1; k++)
{
cflag=0;
if (c[k]>=10)
cflag = c[k]/10;
c[k-1] += cflag;
c[k] = c[k];
}
for (i=0; 1; i++)
if (c[i])
break;
while(i < alen+blen)
printf("%d", c[i++]);
printf("\n");
}