|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
有点时间,随便乱写代码。
一些时候想计算超大值,程序数据类型是不允许的,比如:777888999 * 777888999,最大的 double 类型也都无法做到完全保存其运算结果,所以这里必须用高精度的运算函数,将数据变成数组或字符串之类的,进行逐个位计算。
我的代码只能用来计算乘法、階乘等算式。
例子:54! = 2.308437e+71(结果超过 71位)
- #include <iostream>
- #include <string>
- #include <algorithm>
- using std::string, std::to_string, std::reverse;
- namespace multiplication {
- string multiply(string A, string B) {
- reverse(A.begin(), A.end());
- reverse(B.begin(), B.end());
- size_t m = A.size(), n = B.size();
- string C(m + n, '0');
- for (int i, carry = i = 0; i < n; ++i, carry = 0) {
- for (int j = 0, num; j < m; ++j) {
- num = (C[i + j] - '0') + carry + ((A[j] - '0') * (B[i] - '0'));
- C[i + j] = (num % 10) + '0';
- carry = num / 10;
- }
- C[i + m] += carry;
- }
- reverse(C.begin(), C.end());
- return C;
- }
- string multiply(int a, int b) {
- string
- A = to_string(a),
- B = to_string(b);
- return multiply(A, B);
- }
- string multiply(int a, string B) {
- string A = to_string(a);
- return multiply(A, B);
- }
- }
- using multiplication::multiply;
- namespace factorial {
- string f(int num) {
- string res = "1";
- for (int n = num; n > 0; --n) {
- res = multiply(n, res);
- }
- string ans;
- bool flag = false;
- for (const char& c : res) {
- if (c - '0') flag = true;
- if (flag) ans.push_back(c);
- }
- return ans;
- }
- }
- using factorial::f;
- using std::cout, std::endl;
- int main(void) {
- int num = 54;
- cout << f(num) << endl;
- return 0;
- }
复制代码- 230843697339241380472092742683027581083278564571807941132288000000000000
复制代码 |
评分
-
查看全部评分
|