https://pan.baidu.com/s/1V9bNA2fMJLZxacEEOsqDGw

3 篇文章 9 订阅
2 篇文章 9 订阅

链接:https://pan.baidu.com/s/1V9bNA2fMJLZxacEEOsqDGw

提取码:xxmt

  • 18
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 103
    评论
以下是一个可能的实现: ``` #include <iostream> #include <cstring> using namespace std; class BigNumArith { private: int num1[100], num2[100], res[200]; int len1, len2, resLen; public: BigNumArith() { memset(num1, 0, sizeof(num1)); memset(num2, 0, sizeof(num2)); memset(res, 0, sizeof(res)); len1 = len2 = resLen = 0; } ~BigNumArith() {} void input() { char str1[100], str2[100]; cout << "Please enter one: "; cin >> str1; cout << "please enter two: "; cin >> str2; len1 = strlen(str1); len2 = strlen(str2); for (int i = 0; i < len1; i++) { num1[i] = str1[len1-1-i] - '0'; } for (int i = 0; i < len2; i++) { num2[i] = str2[len2-1-i] - '0'; } } void add() { int carry = 0; resLen = max(len1, len2); for (int i = 0; i < resLen; i++) { int sum = num1[i] + num2[i] + carry; res[i] = sum % 10; carry = sum / 10; } if (carry > 0) { res[resLen++] = carry; } } void sub() { int borrow = 0; resLen = max(len1, len2); for (int i = 0; i < resLen; i++) { int diff = num1[i] - num2[i] - borrow; if (diff < 0) { diff += 10; borrow = 1; } else { borrow = 0; } res[i] = diff; } while (resLen > 0 && res[resLen-1] == 0) { resLen--; } } void mul() { resLen = len1 + len2; for (int i = 0; i < len1; i++) { for (int j = 0; j < len2; j++) { res[i+j] += num1[i] * num2[j]; res[i+j+1] += res[i+j] / 10; res[i+j] %= 10; } } while (resLen > 0 && res[resLen-1] == 0) { resLen--; } } void div() { int divisor[100], quotient[100]; memcpy(divisor, num2, sizeof(num2)); memset(quotient, 0, sizeof(quotient)); resLen = len1 - len2 + 1; for (int i = len1-1; i >= len2-1; i--) { int q = 0; while (compare(num1+i-len2+1, divisor, len2) >= 0) { substract(num1+i-len2+1, divisor, len2); q++; } quotient[i-len2+1] = q; } while (resLen > 0 && quotient[resLen-1] == 0) { resLen--; } memcpy(res, quotient, sizeof(quotient)); } void display() { cout << "one+two="; for (int i = resLen-1; i >= 0; i--) { cout << res[i]; } cout << endl; } void clear() { memset(num1, 0, sizeof(num1)); memset(num2, 0, sizeof(num2)); memset(res, 0, sizeof(res)); len1 = len2 = resLen = 0; } private: int compare(int* a, int* b, int len) { for (int i = len-1; i >= 0; i--) { if (a[i] < b[i]) { return -1; } else if (a[i] > b[i]) { return 1; } } return 0; } void substract(int* a, int* b, int len) { int borrow = 0; for (int i = 0; i < len; i++) { int diff = a[i] - b[i] - borrow; if (diff < 0) { diff += 10; borrow = 1; } else { borrow = 0; } a[i] = diff; } } }; int main() { BigNumArith bna; bna.input(); bna.add(); bna.display(); bna.clear(); bna.input(); bna.sub(); bna.display(); bna.clear(); bna.input(); bna.mul(); bna.display(); bna.clear(); bna.input(); bna.div(); bna.display(); bna.clear(); return 0; } ``` 说明: 1. 本实现中,使用了三个私有函数:`compare`、`substract`和`clear`。其中,`compare`函数用于比较两个整数数组的大小,返回1表示第一个大于第二个,返回-1表示第一个小于第二个,返回0表示相等;`substract`函数用于计算两个整数数组的差,并将结果保存在第一个数组中;`clear`函数用于将所有成员变量清零,以便进行下一轮计算。 2. 在进行加、减、乘、除运算时,需要考虑进位和借位的情况,需要注意不同位数的处理方式不同。 3. 由于本题中的数据非常大,因此需要使用数组来保存数据,同时需要注意数组的长度需要足够大。 4. 在除法运算中,需要用到两个数组的值,因此需要使用memcpy函数进行拷贝。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜡笔小车

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值