高精A+B

 

提供两种思路,分别是用字符数组存储每一位进行计算(2种代码)和用int数组存储每一位进行计算(1种代码)

常见的做法是用int数组存储计算,这种方法比字符数组可以少考虑几个麻烦,推荐用int数组存储计算

当时看到可以用字符串存储大整数,就一直用字符数组存储计算,计算过程中需要进行字符‘n’和数字n的转换,还要取余、取模,感觉非常别扭,后来看到别人用整数数组存储计算,恍然大悟,觉得自己好傻~

 

用字符数组计算主要有两个麻烦,

第一个,用ASCII码进行计算,因为涉及到取余和取模,就很别扭,但是仍然可以通过减去'0'模拟数字的计算,最后加上'0'变回ASCII码

第二个,这个比较头疼,就是当两个数a,b的长度不同时,很难把共有位的计算和独有位的计算统一起来(反正我觉得很难),

针对第二个麻烦,有三种思路,

可以将两个字符数组全部初始化为'0',这样相当于长度为500(下面字符数组所能存储的最大长度)的两个大整数相加,长度相同了,

可以将共有位的计算公式和独有位的区别开,用if……else……

也可以慢慢想,直到想出一个可以统一两种情况的公式,

 

字符数组的高精加法写了两种,

第一种,倒序存储大整数,并且统一了两种情况

#include <stdio.h>
#include <string.h>
char a[501], b[501], num1[501], num2[501];

int main()
{
    scanf("%s", a);
    scanf("%s", b);

    int len1 = strlen(a), len2 = strlen(b);

    if (len1 >= len2)//将整数倒序存储,且较长的数用num1[]存放
    {
        for (int i = 0; i < len1; i++)
            num1[i] = a[len1 - 1 - i];
        for (int i = 0; i < len2; i++)
            num2[i] = b[len2 - 1 - i];

    }
    else
    {
        for (int i = 0; i < len1; i++)
            num2[i] = a[len1 - 1 - i];
        for (int i = 0; i < len2; i++)
            num1[i] = b[len2 - 1 - i];

    }
    len1 = strlen(num1);//len1代表较长的数的长度,len2代表较短的
    len2 = strlen(num2);
    
    for (int i = 0; i < len1; i++)//用ASCII码进行计算,比较麻烦
    {
        num1[i + 1] += (num2[i]-'0' + num1[i]-'0') / 10;
        num1[i] = (num2[i]-'0' + num1[i]-'0') % 10+'0';
    }
    if (num1[len1] == 1)
        num1[len1] += '0';
    for (int i = strlen(num1) - 1; i >= 0; i--)
        printf("%d", num1[i]-'0');    

    return 0;
}

 

第二种,顺序存储大整数,模仿n位全加器进行计算,对于两数长度不同的情况进行了讨论,(这是最早写的代码,看着有点不一样)

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

#define MAXSIZE 600

int main()
{
    char a[MAXSIZE] = { '\0' };
    char b[MAXSIZE] = { '\0' };
    int flag = 0;
    scanf("%s",a);
    scanf("%s",b);
    int i, j;
    char* big;
    char* small;
    if (strlen(a) < strlen(b))
    {
        big = b;
        small = a;

    }
    else
    {
        big = a;
        small = b;
    }
    i = strlen(big) - 1;
    j = strlen(small) - 1;

    while (j!=-1)
    {
        int tmp = small[j] + big[i] + flag;
        if (tmp > '0' + '9')
        {
            flag = 1;
            tmp = tmp - '9' - 1;
        }
        else
        {
            tmp = tmp - '0';
            flag = 0;
        }
        big[i] = tmp;
        i--;
        j--;
    }
    while (i != -1)
    {
        int tmp = flag + big[i];
        if (tmp > '9')
        {
            flag = 1;
            tmp = tmp - 10;
        }
        else
        {
            flag = 0;
        }
        big[i] = tmp;
        i--;
    }
    if(flag)
        printf("1%s", big);
    else
        printf("%s", big);
    return 0;
}

 

利用整数数组存储大整数进行计算,

整体原理和字符数组的第一种相同,也是最常见的

#include <stdio.h>
#include <string.h>
char a[502], b[502];
int num1[502], num2[502];//元素值默认为0,这个在后面的计算很重要,将两个大整数统一成长度为501的数,如果用局部变量,还需要初始化为0才有这样的效果

int main()
{
    scanf("%s", a);
    scanf("%s", b);

    int len1 = strlen(a), len2 = strlen(b),len=0;

    for (int i = 0; i < len1; i++)
        num1[i] = a[len1 - 1 - i] - '0';
    for (int i = 0; i < len2; i++)
        num2[i] = b[len2 - 1 - i] - '0';
    len = (len1 >= len2) ? len1 : len2;
    for (int i = 0; i < len; i++)
    {
        num1[i + 1] += (num2[i] + num1[i]) / 10;
        num1[i] = (num2[i] + num1[i])% 10;
    }
    if (num1[len] == 1)
        len++;
    for (int i = len - 1; i >= 0; i--)
        printf("%d", num1[i]);

    return 0;
}

 

posted @ 2020-07-20 09:40  _lyl  阅读(164)  评论(0编辑  收藏  举报