程序设计基础课程设计—高精度计算

个人博客地址:https://travis1024.github.io/

高精度计算

1. 问题描述

用整型数组表示10进制大整数(超过2^32的整数),数组的每个元素存储大整数的一位数字,实现大整数的加减法。

2. 问题分析

  1. 大整数无法使用常规的整数类型进行表示,需要考虑使用字符串或者数组对输入的大整数进行存储。

  2. 加减法的模拟过程需要仔细考虑,同时也需要考虑如何处理大整数的符号问题。

3. 处理方法设计(算法步骤)

  1. 首先使用字符串存储输入的两个大整数;

  2. 然后对两个字符串的第一位的符号位进行提取并记录,如果第一位为数字位则认为该整数为正数;

  3. 随后根据两个大整数的符号位以及选择的加法或者减法运算进行条件判断,跳转到符合其条件的逻辑结构;

  4. 在进行加减法时,首先将字符串的每一位存储到int类型的数组中(不包括符号位),然后从最低位依次向最高位处理,计算结果存储到int类型的result数组中;

  5. 将result数组中的结果转换成string类型并返回,最终根据大整数符号位及加减法的选择对最终结果的符号进行判断并输出。

4.测试数据设计

减法大整数1888888888888888888888888888888888888
大整数2-666666666666666666666666666666666666
减法大整数1666666666666666666666
大整数2888888888888888888888
加法大整数1-8888888888888888888888888
大整数26666666666666666666666666
减法大整数10
大整数222222222222222222222222222222222222222

5.测试结果分析

6.程序结构

7.源代码

#include <iostream>
#include <sstream>
#include<string>
#define SUM 100
using namespace std;
bool Judge(string A, string B) {
    for (int j = 0; j < A.size(); j++) {
        if (A[j] > B[j]) return true;
        if (A[j] < B[j]) return false;
    }
    return true;
}
string IntToString(int &i) {
    string s;
    stringstream ss(s);
    ss << i;
    return ss.str();
}
string addition(string A, string B, int max) {
    string end;
    int result[SUM] = {0}, array_1[SUM] = {0}, array_2[SUM] = {0};
    for (int i = 0; i < A.size(); i++)
        array_1[SUM - A.size() + i] = A[i] - '0';
    for (int i = 0; i < B.size(); i++)
        array_2[SUM - B.size() + i] = B[i] - '0';
    for (int i = 0; i < max; i++) {
        result[SUM - i - 1] = array_1[SUM - i - 1] + array_2[SUM - i - 1] + result[SUM - i - 1];
        if (result[SUM - i - 1] >= 10) {
            result[SUM - i - 2] = result[SUM - i - 2] + 1;
            result[SUM - i - 1] = result[SUM - i - 1] - 10;
        }
    }
    for (int i = 0; i < max + 1; i++) {
        int &now = result[SUM - max + i - 1];
        end += IntToString(now);
    }
    if (end[0] == '0') end.erase(0, 1);
    return end;
}
string subtraction(string A, string B, int max) {
    string end;
    int result[SUM] = {0}, array_1[SUM] = {0}, array_2[SUM] = {0};
    for (int i = 0; i < A.size(); i++)
        array_1[SUM - A.size() + i] = A[i] - '0';
    for (int i = 0; i < B.size(); i++)
        array_2[SUM - B.size() + i] = B[i] - '0';
    for (int i = 0; i < max; i++) {
        result[SUM - i - 1] = array_1[SUM - i - 1] - array_2[SUM - i - 1] + result[SUM - i - 1];
        if (result[SUM - i - 1] < 0) {
            result[SUM - i - 2] = result[SUM - i - 2] - 1;
            result[SUM - i - 1] = result[SUM - i - 1] + 10;
        }
    }
    for (int i = 0; i < max + 1; i++) {
        int &now = result[SUM - max + i - 1];
        end += IntToString(now);
    }
    if (end[0] == '0') end.erase(0, 1);
    return end;
}

int main() {
    int index = 0, A_flag = 1, B_flag = 1, flag = 0;
    string A, B, result;
    cout << "Please choose <1>-addition or <2>-subtraction  (Enter the Numbers): ";
    cin >> index;
    cout << "Please enter the first number: ";
    cin >> A;
    if (A[0] == '-') {
        A_flag = -1;
        A.erase(0, 1);
    }
    cout << "Please enter the second number: ";
    cin >> B;
    if (B[0] == '-') {
        B_flag = -1;
        B.erase(0, 1);
    }
    int max_number = (A.size() > B.size()) ? A.size() : B.size();
    if (A_flag == 1 && B_flag == 1) {
        if (index == 1) result = addition(A, B, max_number);
        if (index == 2) {
            if (A.size() > B.size() || (A.size() == B.size() && Judge(A, B))) result = subtraction(A, B, max_number);
            if (A.size() < B.size() || (A.size() == B.size() && !Judge(A, B))) {
                result = subtraction(B, A, max_number);
                result.insert(0, "-");
            }
        }
    } else if (A_flag == 1 && B_flag == -1) {
        if (A.size() > B.size() || (A.size() == B.size() && Judge(A, B))) {
            if (index == 1) result = subtraction(A, B, max_number);
            if (index == 2) result = addition(A, B, max_number);
        }
        if (A.size() < B.size() || (A.size() == B.size() && !Judge(A, B))) {
            if (index == 1) {
                result = subtraction(B, A, max_number);
                result.insert(0, "-");
            }
            if (index == 2) result = addition(A, B, max_number);
        }
    } else if (A_flag == -1 && B_flag == 1) {
        if (index == 1) {
            if (A.size() > B.size() || (A.size() == B.size() && Judge(A, B))) {
                result = subtraction(A, B, max_number);
                result.insert(0, "-");
            }
            if (A.size() < B.size() || (A.size() == B.size() && !Judge(A, B))) {
                result = subtraction(B, A, max_number);
            }
        }
        if (index == 2) {
            result = addition(A, B, max_number);
            result.insert(0, "-");
        }
    } else if (A_flag == -1 && B_flag == -1) {
        if (index == 1) {
            result = addition(A, B, max_number);
            result.insert(0, "-");
        }
        if (index == 2) {
            if (A.size() > B.size() || (A.size() == B.size() && Judge(A, B))) {
                result = subtraction(A, B, max_number);
                result.insert(0, "-");
            }
            if (A.size() < B.size() || (A.size() == B.size() && !Judge(A, B))) {
                result = subtraction(B, A, max_number);
            }
        }
    }
    cout << "The result is " << result << endl;
    return 0;
}
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值