您的位置:首页 > 编程语言 > C语言/C++

C语言实现大整数运算

2014-10-11 15:52 453 查看

一、简介:

我们知道,C语言中的整型有short、int、long。ANSI C标准定义的整数类型范围为:

类型比特数取值范围
unsigned short int160至65535(0至2^16-1)
signed short int16-32768至32767(-2^15至2^15-1)
unsigned int160至65535(0至2^16-1)
signed int16-32768至32767(-2^15至2^15-1)
unsigned long320至4294967295(0至2^32-1)
signed long32-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
, b
;
    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 
, char 
);
int main()
{
    char a
, b
;
    printf("input:\n");
    gets(a);
    gets(b);
    printf("result:\n");
    Multiply(a, b);
    return 0;
}
void Multiply(char a
, char b
)
{
    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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: