C++实现20位整数加减乘除运算

本文介绍使用C++代码实现20位整数加减乘除运算,并提供详细的代码示例,包括如何使用字符串数组存储20位整数、如何实现加减乘除运算,以及如何处理除法运算的商和余数。

问题描述

C++能完成的整数加减乘除运算的数据范围-2147483648~2147483647之间,超过这个范围数就溢出了。现有20位整数加减乘除,要解决的问题有:

  1. 如何存储:可以使用字符串数组存储20位数字,每个元素存放一个数字字符。
  2. 如何运算:从低位向高位逐个运算,考虑对应数字位向高位产生的进位。

代码实现

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

const int MAX_SIZE = 21;

void reverseString(char* str) {
    int len = strlen(str);
    for (int i = 0; i < len/2; i++) {
        swap(str[i], str[len-i-1]);
    }
}

void add(const char* num1, const char* num2, char* result) {
    int carry = 0;
    int len1 = strlen(num1);
    int len2 = strlen(num2);
    int len = max(len1, len2);
    for (int i = 0; i < len; i++) {
        int n1 = i < len1 ? num1[i] - '0' : 0;
        int n2 = i < len2 ? num2[i] - '0' : 0;
        int sum = n1 + n2 + carry;
        result[i] = sum % 10 + '0';
        carry = sum / 10;
    }
    if (carry > 0) {
        result[len] = carry + '0';
        result[len + 1] = '\0';
    } else {
        result[len] = '\0';
    }
    reverseString(result);
}

void subtract(const char* num1, const char* num2, char* result) {
    int borrow = 0;
    int len1 = strlen(num1);
    int len2 = strlen(num2);
    int len = max(len1, len2);
    for (int i = 0; i < len; i++) {
        int n1 = i < len1 ? num1[i] - '0' : 0;
        int n2 = i < len2 ? num2[i] - '0' : 0;
        int diff = n1 - n2 - borrow;
        if (diff < 0) {
            diff += 10;
            borrow = 1;
        } else {
            borrow = 0;
        }
        result[i] = diff + '0';
    }
    int pos = len - 1;
    while (pos > 0 && result[pos] == '0') {
        result[pos] = '\0';
        pos--;
    }
    reverseString(result);
}

void multiply(const char* num1, const char* num2, char* result) {
    int len1 = strlen(num1);
    int len2 = strlen(num2);
    int len = len1 + len2;
    int* temp = new int[len];
    memset(temp, 0, len * sizeof(int));
    for (int i = len1 - 1; i >= 0; i--) {
        for (int j = len2 - 1; j >= 0; j--) {
            int n1 = num1[i] - '0';
            int n2 = num2[j] - '0';
            int product = n1 * n2;
            temp[i + j + 1] += product;
        }
    }
    int carry = 0;
    for (int i = len - 1; i >= 0; i--) {
        int sum = temp[i] + carry;
        result[i] = sum % 10 + '0';
        carry = sum / 10;
    }
    if (carry > 0) {
        result[0] = carry + '0';
        result[len] = '\0';
    } else {
        result[len - 1] = '\0';
    }
    delete[] temp;
}

void divide(const char* num1, const char* num2, char* quotient, char* remainder) {
    int len1 = strlen(num1);
    int len2 = strlen(num2);
    if (len2 == 1 && num2[0] == '0') {
        cout << "除数不能为0" << endl;
        return;
    }
    if (len1 < len2 || (len1 == len2 && strcmp(num1, num2) < 0)) {
        strcpy(quotient, "0");
        strcpy(remainder, num1);
        return;
    }
    strcpy(remainder, num1);
    quotient[0] = '\0';
    char* temp = new char[len1+1];
    temp[len1] = '\0';
    for (int i = 0; i < len1; i++) {
        temp[i] = remainder[i];
    }
    int len = len1 - len2;
    for (int i = 0; i <= len; i++) {
        int count = 0;
        while (strcmp(temp, num2) >= 0) {
            subtract(temp, num2, temp);
            count++;
        }
        quotient[i] = count + '0';
        if (temp[0] == '\0') {
            strcpy(temp, remainder + i + len2);
        } else {
            temp[strlen(temp)] = remainder[i + len2];
        }
    }
    quotient[len + 1] = '\0';
    delete[] temp;
}

int main() {
    char num1[MAX_SIZE];
    char num2[MAX_SIZE];
    char result[MAX_SIZE];

    cout << "请输入第一个整数:";
    cin >> num1;
    cout << "请输入第二个整数:";
    cin >> num2;

    // 加法
    add(num1, num2, result);
    cout << "加法结果:" << result << endl;

    // 减法
    subtract(num1, num2, result);
    cout << "减法结果:" << result << endl;

    // 乘法
    multiply(num1, num2, result);
    cout << "乘法结果:" << result << endl;

    // 除法
    char quotient[MAX_SIZE];
    char remainder[MAX_SIZE];
    divide(num1, num2, quotient, remainder);
    cout << "除法结果:" << "商:" << quotient << " 余数:" << remainder << endl;

    return 0;
}

代码说明

  1. 存储:使用字符串数组 char num1[MAX_SIZE]char num2[MAX_SIZE] 存储两个20位整数,每个元素存储一个数字字符。
  2. 加法add 函数从低位向高位逐个运算,考虑进位。
  3. 减法subtract 函数从低位向高位逐个运算,考虑借位。
  4. 乘法multiply 函数使用一个临时数组存储乘积的中间结果,最后再将结果存储到 result 数组中。
  5. 除法divide 函数使用重复减法的方法实现除法,并输出商和余数。

注意

这段代码还没有进行输入验证,所以需要确保输入的整数位数不超过20位,并且不包含非数字字符。

总结

本文介绍了使用C++代码实现20位整数加减乘除运算的方法,并提供了详细的代码示例。通过使用字符串数组存储整数和从低位向高位逐个运算的方法,可以有效地实现大整数的运算。

C++实现20位整数加减乘除运算

原文地址: https://www.cveoy.top/t/topic/puk1 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录