C++实现20位整数加减乘除运算
C++实现20位整数加减乘除运算
本文介绍使用C++代码实现20位整数加减乘除运算,并提供详细的代码示例,包括如何使用字符串数组存储20位整数、如何实现加减乘除运算,以及如何处理除法运算的商和余数。
问题描述
C++能完成的整数加减乘除运算的数据范围-2147483648~2147483647之间,超过这个范围数就溢出了。现有20位整数加减乘除,要解决的问题有:
- 如何存储:可以使用字符串数组存储20位数字,每个元素存放一个数字字符。
- 如何运算:从低位向高位逐个运算,考虑对应数字位向高位产生的进位。
代码实现
#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;
}
代码说明
- 存储:使用字符串数组
char num1[MAX_SIZE]和char num2[MAX_SIZE]存储两个20位整数,每个元素存储一个数字字符。 - 加法:
add函数从低位向高位逐个运算,考虑进位。 - 减法:
subtract函数从低位向高位逐个运算,考虑借位。 - 乘法:
multiply函数使用一个临时数组存储乘积的中间结果,最后再将结果存储到result数组中。 - 除法:
divide函数使用重复减法的方法实现除法,并输出商和余数。
注意
这段代码还没有进行输入验证,所以需要确保输入的整数位数不超过20位,并且不包含非数字字符。
总结
本文介绍了使用C++代码实现20位整数加减乘除运算的方法,并提供了详细的代码示例。通过使用字符串数组存储整数和从低位向高位逐个运算的方法,可以有效地实现大整数的运算。
原文地址: https://www.cveoy.top/t/topic/puk1 著作权归作者所有。请勿转载和采集!