C语言实现大整数运算

一、简介:

我们知道,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");
}


  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值