• 高精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] = { '' };
        char b[MAXSIZE] = { '' };
        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;
    }
  • 相关阅读:
    设备接入项目杂记
    用lucene替代mysql读库的尝试
    node(ActiveMq)
    mysql集群(双主)
    mysql集群(主从)
    DoraCMS 源码知识点备注
    Flex使用Scroller组件实现以鼠标为中心的缩放
    JQuery Mobile Popup窗口定位
    Flex Builder 不能Profile的另一个原因:不能使用中文用户名
    STM32407入门笔记
  • 原文地址:https://www.cnblogs.com/lylhome/p/13342102.html
Copyright © 2020-2023  润新知