【C】两个大数相加

思想:大数超出了计算机的整形表示范围,故一般用字符串记录,两个大数相加就不能简单的用“+”进行运算,得绕个弯。先把字符串转成int数组(借助与字符'0'的差来实现),每位都放在数组中,然后对数组进行按位加。

#include <iostream>
using namespace std;
const int maxnum=20;
void charTnum(int* intab,char *charab,int len)//字符串转整形,高低位倒置
{
    int i=0;
    for (i=0;i<len;i++)
    {
        intab[len-1-i]=charab[i]-'0';
    }
}
void initABAns(int* ia,int* ib,int *ians)//数组全置0
{
    int i=0;
    for (i=0;i<maxnum;i++)
    {
        ia[i]=0;ib[i]=0;
    }
    for (i=0;i<maxnum+1;i++)
    {
        ians[i]=0;
    }
}
void BigNumAdd(char* ca,char* cb,int* ians)//示意:ans=a+b
{
    int alen=strlen(ca),blen=strlen(cb);
    int* ia,*ib,maxlen=0;int i=0;
    ia=(int*)malloc(maxnum*sizeof(int));
    ib=(int*)malloc(maxnum*sizeof(int));
    initABAns(ia,ib,ians);
    charTnum(ia,ca,alen);
    charTnum(ib,cb,blen);
    if (alen>blen)
        maxlen=alen;
    else
        maxlen=blen;
    for (i;i<maxlen;i++)//数组相加,结果放ians
    {
        ians[i]=ia[i]+ib[i]+ians[i];
        if(ians[i]>9)
        {
            ians[i]=ians[i]-10;
            ians[i+1]++;
        }
    }
    free(ia);
    free(ib);
}
void main()
{
    char *ca,*cb;
    int* ians,maxlen=0;
    ca=(char*)malloc(maxnum*sizeof(char));
    cb=(char*)malloc(maxnum*sizeof(char));
    ians=(int*)malloc((maxnum+1)*sizeof(int));
    printf("请输入加数a  :");
    scanf("%20s",ca);//这个'20'很鸡肋,最好用maxnum,但不知道怎么写这行代码
    printf("请输入被加数b:");
    scanf("%20s",cb);
    printf("\n");
    printf("输出结果为:");
    BigNumAdd(ca,cb,ians);
    int alen=strlen(ca),blen=strlen(cb);
    if (alen>blen)
        maxlen=alen;
    else
        maxlen=blen;
    if(ians[maxlen]!=0)printf("%d",ians[maxlen]);//如果最高位有进位,就显示出来
    for (int i=0;i<maxlen;i++)
    {
        printf("%d",ians[maxlen-1-i]);
    }
    printf("\n");
    free(ca);
    free(cb);
    free(ians);
}

原文地址:https://www.cnblogs.com/caixu/p/2192189.html