大数加法

大数运算指的是两个很大的数之间进行运算。由于这个数很大 可以达到几百位。那么直接用int将无法表示。所以我们要考虑 其他方法进行计算。直接模拟就是一个比较直观方便的处理方法 这里以高精度加法为例进行说明。

首先我们将大数以字符串的形式读入到内存中

计算的时候就模拟小学时学习的竖式相加.例如下面:

例如:

    18
  + 21
  -----
    39

计算的时候,注意一下进位就可以!

至于乘法。方法还是一样。减法计算的时候。计算之前要比较 一下减数和被减数大小。然后确定正负号。 这里计算的是高精度整数,如果是小数的话。计算时要确定小数点的 位置。

下面贴一下高精度加法的代码. 高精度加法代码

高精度乘法代码

#include<stdio.h>
#include<string.h>

#define MAX 1000
char s1[MAX];
char s2[MAX];
char ans[MAX];
void change(char *s1)
{
    int i=0,len;
    char tt;
    len=strlen(s1)-1;
    while(i<len)
    {
        tt=s1[len];
        s1[len]=s1[i];
        s1[i]=tt;
        len--;
        i++;
    }
}
void bigadd(char *s1,char *s2,char *ans)
{
    int i=0,flag=0,temp;
    for(i=0,temp=0;s1[i]!='\0' && s2[i]!='\0';i++)
    {
        temp=s1[i]+s2[i]-96+flag;
        flag=temp/10;
        ans[i]=temp%10+48;
    }
    for(;s1[i]!='\0';i++)
    {
        temp=s1[i]-48+flag;
        flag=temp/10;
        ans[i]=temp%10+48;
    }
    for(;s2[i]!='\0';i++)
    {
        temp=s2[i]-48+flag;
        flag=temp/10;
        ans[i]=temp%10+48;
    }
    //考虑最后是否存在进位
    if(flag) ans[i++]=flag+48;
    ans[i]='\0';
    // 逆序输出就是答案
    for(i--;i>=0;i--)
        putchar(ans[i]);
    putchar('\n');
}
int main()
{
    int n,len;
    while(scanf("%s%s",s1,s2)!=EOF)
    {//翻转字符串方便计算
        change(s1);
        change(s2);
        bigadd(s1,s2,ans);
    }
    return 0;
}