【欧拉计划】Q8:大整数运算

大整数运算


1.大整数加法

整数存储类型范围
short(2 byte)- 215 ~ (215 - 1)
int(4 byte)- 231 ~ (231 - 1)
long long(8 byte)- 263 ~ (263 - 1)
  1. 使用字符串进行数字的输入
  2. 将数字拆分存储在数组中,num[0]存储数字长度,num[1]存储个位、num[2]十位、num[3]百位……以此类推倒序存储
  3. 按照加法规则将数组中对应的数字相加后存入结果数组中
  4. 对需要进位的数字进行进位
#include<iostream>
#include<cstring>
using namespace std;

char s1[1005], s2[1005];//输入的两个数字存储在字符串中
int num1[1005], num2[1005];//输入的两个数字转化存储在数组中
int sum[1005];//数字相加后的结果存储数组

int main(){
    //1.使用字符串进行数字的输入
    cin >> s1 >> s2;
    num1[0] = strlen(s1);
    num2[0] = strlen(s2);
    //2.将数字拆成一位位数字存储在数组中
    for(int i = 0, j = num1[0]; s1[i]; ++i, --j){
        num1[j] = s1[i] - '0';
    }
    for(int i = 0, j = num2[0]; s2[i]; ++i, --j){
        num2[j] = s2[i] - '0';
    }
    //3.按照加法规则将数组中对应的数字相加后存入结果数组中
    sum[0] = max(num1[0], num2[0]);
    for(int i = 1; i <= sum[0]; ++i){
        sum[i] = num1[i] + num2[i];
    }
    //4.对需要进位的数字进行进位
    for(int i = 1; i <= sum[0]; ++i){
        if(sum[i] > 9){
            sum[i + 1] += sum[i] / 10;
            sum[i] %= 10;
            //如果是最高位进位,则结果数字的长度+1
            if(i == sum[0]){
                sum[0]++;
            }
        }
    }
    for(int i = sum[0]; i > 0; --i){
        cout << sum[i];
    }
    cout << endl;

    return 0;
}

2.大整数乘法

  1. 使用字符串进行数字的输入
  2. 将数字拆成一位位数字存储在数组中,num[0]存储数字长度,num[1]存储个位、num[2]存储十位、num[3]存储百位,以此类推倒着存储
  3. 按照乘法规则对数组中对应的数字进行操作存入结果数组中:ans[i + j - 1] = n1[i] * n2[j];
  4. 对需要进位的数字进行进位

image-20210417183217793

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

char s1[1005], s2[1005];
int n1[1005], n2[1005], ans[2005];

int main(){
    //1.使用字符串进行数字的输入
    cin >> s1 >> s2;
    n1[0] = strlen(s1), n2[0] = strlen(s2);
    //2.将数字拆成一位位数字存储在数组中
    for(int i = 0, j = n1[0]; i < n1[0]; ++i, --j){
        n1[j] = s1[i] - '0';
    }
    for(int i = 0, j = n2[0]; i < n2[0]; ++i, --j){
        n2[j] = s2[i] - '0';
    }
    //3.按照乘法规则对数组中对应的数字进行操作存入结果数组中:ans[i + j - 1] = n1[i] * n2[j];
    ans[0] = n1[0] + n2[0] - 1;
    for(int i = 1; i <= n1[0]; ++i){//遍历第一个乘数
        for(int j = 1; j <= n2[0]; ++j){//遍历第一个乘数
            ans[i + j - 1] += n1[i] * n2[j];
        }
    }
    //4.对需要进位的数字进行进位,乘法进位可能一次性需要进多位
    for(int i = 1; i <= ans[0]; ++i){
        if(ans[i] > 9){
            ans[i + 1] += ans[i] / 10;
            ans[i] %= 10;
            if(i == ans[0]){
                ans[0]++;
            }
        }
    }
    for(int i = ans[0]; i > 0; --i){
        cout << ans[i];
    }
    cout << endl;
    return 0;
}

tips:文章部分内容参考算法刷题课程,题解图示内容及代码根据老师课程、以及自己对知识的理解,进行二次整理和部分补充,仅供学习参考使用,不可商业化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值