栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

高精度运算—整数加法运算(C语言描述)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

高精度运算—整数加法运算(C语言描述)

        在C语言所给的数据类型中,long long类型数据最大数值为9223372036854775807,当我们要运算的数远远超过了它的范围时,就不能用基本数据类型来表示。为了解决这一问题,我们要进行高精度(大数)运算。

        解决思路:我们可以将要进行运算的数存储在字符数组里,模拟手算的方式将运算结果存储在整型数组里。

#include 
#include 

int main()
{
    char a[100], b[100];//定义两个字符数组,将输入的数据存储在字符数组里
    int  c[110];//定义一个整形数组,用于存放运算的结果,从低位向高位存放
    memset(c, 0, sizeof(c));
    scanf("%s %s", &a, &b);
    int m = strlen(a), n = strlen(b), max, i, j, ans,p,q;//求出字符串a,b的长度(位数)
    ans = 0;//ans用来存储进位数字
    for (m -= 1, n -= 1, j = 0; m >= 0 && n >= 0; m--, n--, j++)
    //由于并不知道两个数字位数是否相同,又为了保证对应位相加,所以当有一个数所有位已经运算完成时,跳出循环
    {
        p = a[m]-'0'; q = b[n]-'0';//用p,q做中间变量为了方便调试
        ans = p + q  + ans;
        c[j] = ans % 10;
        ans = ans / 10;
        if (m == 0 || n == 0)
            break;
    }
    j++;//跳出循环时存放结果数组并没有进位(上次循环时已经占用了j位置),所以j要加一
    if (m == 0 && n != 0)//当a的位数小于b的位数时
    {
        n--;//上从循环结束时n位已经参与了运算,要进行下一位的运算,所以n要减一
        for (; n >= 0; n--, j++)
        {
            //这里不能直接将q赋值给c[j](上一位和这一位的运算可能有进位)
            q = b[n] - 48;
            ans = q + ans;
            c[j] = ans % 10;
            ans = ans / 10;
        }
    }
    if (m != 0&&n==0)//当b的位数小于a的位数时
    {
        m--;
        for (; m >= 0; m--, j++)
        {
            p = a[m] - 48;
            c[j]=p;
            ans = p + ans;
            c[j] = ans % 10;
            ans = ans / 10;
        }
    }
    for (j = j - 1; j >= 0; j--)//从最高位向低位依次进行输出
    {
        printf("%d", c[j]);
    }
    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/303369.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号