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

大数运算

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

大数运算

整数

加法

        模拟高精度加法运算

        将数据存放在字符串里,然后反向存放到数组中,再对应下标操作进位,反向存放的目的就在于数组往后扩张更方便,往前无法扩张就得移动整个数组

附Euler-13代码

#include
#include
using namespace std;

char str1[55], str2[55];
int num1[55], num2[55], sum[55];

int main() {
    
    num1[0] = 50;
    sum[0] = 50;
    int i, j;
    while(cin >> str1) {

        //num1[0] = strlen(str1);
        //num2[0] = strlen(str2);
    
        for(i = 0, j = num1[0]; i < num1[0]; ++i, --j)
            num1[j] = str1[i] - '0';
    
        //for(i = 0, j = num2[0]; i < num2[0]; ++i, --j)
        //    num2[j] = str2[i] - '0';

        //sum[0] = max(num1[0], num2[0]);

        for(i = 1; i <= sum[0]; ++i){
            sum[i] += num1[i]; //+ num2[i];
            if (sum[i] > 9){
                sum[i + 1] += sum[i] / 10;
                sum[i] %= 10;
                if(i == sum[0]) ++sum[0];
            }
        }
    }
    for (i = 0, j = sum[0]; i < 10; ++i, --j)
        cout << sum[j];
    cout << endl;

    return 0;
}

乘法

        模拟乘法运算

        将每一位相乘的结果累加,注意移位,画图模拟就懂了

附代码

#include
#include
using namespace std;

int num1[1005], num2[1005], sum[1005];
char str1[1005], str2[1005];

int main () {
    cin >> str1 >> str2;
    num1[0] = strlen(str1);
    num2[0] = strlen(str2);

    int i, j;
    for(i = 0, j = num1[0]; i < num1[0]; ++i, --j)
        num1[j] = str1[i] - '0';
    for(i = 0, j = num2[0]; i < num2[0]; ++i, --j)
        num2[j] = str2[i] - '0';

    for(i = num1[0]; i > 0; --i)
        cout << num1[i];
    cout << endl;
    for(i = num2[0]; i > 0; --i)
        cout << num2[i];
    cout << endl;
    
    sum[0] = num1[0] + num2[0] - 1;
    for(i = 1; i <= num2[0]; ++i){
        for(j = 1; j <= num1[0]; ++j){
            sum[j + i - 1] += num2[i] * num1[j];
            if (sum[j + i - 1] > 10){
                sum[j + i] += sum[j + i - 1] / 10;
                sum[j + i - 1] %= 10;
                if (j + i - 1 == sum[0]) ++sum[0];
            }
        }
    }

    for(i = sum[0]; i > 0; --i)
        cout << sum[i];
    cout << endl;


    return 0;
}

减法

        模拟减法运算

        封装判断大整数大小的函数,判断两数大小,保证大减小,如果小减大,就大减小再最后输出一个负号,这样就避免单位计算出现借位负数,以及长度问题

除法

        模拟除法运算

        有一个待除数的概念,封装判断大整数大小的函数

        1.建立大循环,根据除数的位数来跳转被除数的坐标,如果越界,直接返回商值

        2.例如:除数有4位,直接从被除数第4位开始计算待除数,先比较大小,如果小于除数,待除数再加一位,然后开始大数减法循环,循环更新条件:待除数 -= 除数,++商值;循环终止条件:待除数 < 除数;得到剩余的待除数和商值

        3.判断待除数的位数,然后重复1步骤和2步骤,最后输出商值

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

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

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