12.3 大数加法

大数加法

long long都存不进去啊。
所以说,模拟小学生加法。
用数组存储输入的数字,然后从后往前,记得进位就行了
要考虑的问题:
1)
如果两个数长度不一样,像这样:
在这里插入图片描述
按位加的话,会成这个样子
在这里插入图片描述
你肯定不想吧
这样就有一个翻转数组的方法了
从中间分开,对称交换。
像这样:

 for(int i = 0; i < len / 2; ++i){
        t = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = t;
    }

注意这里的len-i-1。这是因为数组是从0开始标号的,它最大的标号是len-1
2)
还是上边的例子,为什么自动加0了呢。
如果不加的话。
在这里插入图片描述
计算机并不能自动添加0
所以需要做一个判断
像这样:

 ai = i < len1 ? a[i] - '0' : 0;

(c中的ascll码是可以相减的)
如果这里有数的话,那就减0,否则添加0
然后呢,模拟就完事了。


方法一:
#include <stdio.h>
#include <string.h>
void rev(char str[], int len)
{
    char t;
    for(int i = 0; i < len / 2; ++i){
        t = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = t;
    }
}
int main()
{
    char a[1000],b[1000],c[1000];
    int ai, bi, val, carry;
    int len, len1, len2;
    scanf("%s %s", a, b);
    len1 = strlen(a);
    len2 = strlen(b);
    len = len1 > len2 ? len1 : len2;
    rev(a,len1);
    rev(b,len2);
    carry = 0;
    for(int i = 0; i < len; ++i){
        ai = i < len1 ? a[i] - '0' : 0;
        bi = i < len2 ? b[i] - '0' : 0;
        val = (ai + bi + carry) % 10;
        carry = (ai + bi + carry) /10;
        c[i] = val + '0';
    }
    if(carry == 1) putchar('1');
    for(int i = len - 1; i >=0 ; --i)
        putchar(c[i]);
    puts("");

    return 0;
}

和方法一大同小异。也贴上吧。

方法二:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
int main()
{
    char a[1000],b[1000];//创建一个数组。
    int result[1000];//给结果也创建一个
    int lena,lenb,len_result,lenc;//a,b,result的长度也要创建鸭.引入这么一个变量lenc(a+b=c嘛)。
    int i,j,k;//for用的
            while(scanf("%s%s",a,b)!=EOF)//多组输入
            {
            lena=strlen(a);
            lenb=strlen(b);
            for(j=0;j<lena;j++)
                a[j]-='0';
            for(j=0;j<lenb;j++)
                b[j]-='0';//这里只是扩一下容(补0)
            if(lena>lenb) len_result=lena;
            else          len_result=lenb;
            lenc=len_result-1;//模拟竖式加法嘛,
            for(j=lena-1,k=lenb-1;;j--,k--)//既然要循环,就一起啦
            {
                if(j>=0&&k>=0) result[lenc--]=a[j]+b[k];
                else if(j>=0)  result[lenc--]=a[j];
                else if(k>=0)  result[lenc--]=b[k];
                else           break;
            }
            for(j=len_result-1;j>0;j--)//这里是换位加一呢
            {
                if(result[j]>=10)
                    result[j-1]+=result[j]/10;
                    result[j]=result[j]%10;
            }
            for(j=0;j<len_result;j++)
                printf("%d",result[j]);
                printf("\n");//因为我写的多组输入呢,所以要换行哦
            }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42906486/article/details/84779649