C++的无符号整数类型表示范围有限,能表示的十进制无符号整数不超过 20位。编写程序,实现超过 20 位的无符号整数的加法和乘法运算。 要求程序读入文本文件 input. txt,计算其中的表达式的运算结果,并将结果输出到文本文件 output.txt 中
时间: 2023-12-14 22:39:15 浏览: 83
uint128_t:C ++无符号128位整数类型
为了实现超过20位的无符号整数加法和乘法,我们可以使用字符串来存储这些数,然后实现对应的运算。具体实现如下:
```cpp
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
// 字符串逆序
void reverse(string& str) {
int len = str.length();
for (int i = 0; i < len / 2; i++) {
swap(str[i], str[len - i - 1]);
}
}
// 无符号整数加法
string add(string a, string b) {
int len_a = a.length(), len_b = b.length();
int len = max(len_a, len_b);
string res(len, '0');
reverse(a);
reverse(b);
for (int i = 0; i < len; i++) {
int sum = 0;
if (i < len_a) {
sum += a[i] - '0';
}
if (i < len_b) {
sum += b[i] - '0';
}
sum += res[i] - '0';
res[i] = sum % 10 + '0';
if (sum >= 10) {
res.push_back('1');
}
}
reverse(res);
return res;
}
// 无符号整数乘法
string multiply(string a, string b) {
int len_a = a.length(), len_b = b.length();
int len = len_a + len_b;
string res(len, '0');
reverse(a);
reverse(b);
for (int i = 0; i < len_a; i++) {
int carry = 0;
for (int j = 0; j < len_b; j++) {
int sum = (a[i] - '0') * (b[j] - '0') + (res[i + j] - '0') + carry;
carry = sum / 10;
res[i + j] = sum % 10 + '0';
}
if (carry > 0) {
res[i + len_b] += carry;
}
}
reverse(res);
int pos = res.find_first_not_of('0');
if (pos != string::npos) {
return res.substr(pos);
}
return "0";
}
int main() {
ifstream fin("input.txt");
ofstream fout("output.txt");
if (!fin || !fout) {
cout << "文件打开失败" << endl;
return 0;
}
string a, b, op;
while (fin >> a >> op >> b) {
if (op == "+") {
fout << add(a, b) << endl;
}
else if (op == "*") {
fout << multiply(a, b) << endl;
}
}
fin.close();
fout.close();
return 0;
}
```
在这个程序中,我们使用字符串来存储输入的两个数和运算符,然后判断运算符是加法还是乘法,并调用对应的函数来计算结果。在加法函数中,我们首先将两个字符串逆序,然后从低位到高位逐位相加,同时考虑到进位的情况。在乘法函数中,我们也是先将两个字符串逆序,然后使用一个双重循环来计算乘积,同时考虑到进位的情况。最后我们还需要处理一下乘积的前导零。
在读入文件和输出文件时,我们使用了 ifstream 和 ofstream 类来进行文件操作。在打开文件时,我们需要判断文件是否打开成功,如果失败则输出错误信息。
阅读全文