主页 > 创业  > 

C++知识点总结(6):高精度乘法真题代码

C++知识点总结(6):高精度乘法真题代码
一、高精度数 × 低精度数 #include <iostream> #include <cstring> using namespace std; int main() { // 存储并输入两个数字 char a_str[1005] = {}; long long b; cin >> a_str >> b; // 特例先行:结果是0的情况 if (a == 0 || b == 0) { cout << 0; return 0; } // 转换第一个高精度数 int a[1005] = {}; int len_a = strlen(a_str); for (int i = 0; i <= len_a-1; i++) { a[len_a-i-1] = a_str[i] - 48; } // 计算 int len_ans = len_a; long long ans[1005] = {}; long long in = 0; for (int i = 0; i <= len_ans-1; i++) { ans[i] = a[i] * b + in; // 存储数字 in = ans[i] / 10; // 得到进位 ans[i] %= 10; // 在对应的数位上保留实际得数的最后一位 } // 输出结果 while (in > 0) // 最高位处理 { ans[len_ans] = in % 10; len_ans++; in /= 10; } // 正常输出 for (int i = len_ans - 1; i >= 0; i--) { cout << ans[i]; } return 0; } 二、高精度数 × 高精度数 #include <iostream> #include <cstring> using namespace std; int main() { // 存储并输入两个数字 char a_str[1005] = {}; char b_str[1005] = {}; cin >> a_str >> b_str; // 转换高精度数 int a[1005] = {}; int b[1005] = {}; int len_a = strlen(a_str); int len_b = strlen(b_str); for (int i = 0; i <= len_a-1; i++) { a[len_a-i-1] = a_str[i] - 48; } for (int i = 0; i <= len_b-1; i++) { b[len_b-i-1] = b_str[i] - 48; } // 计算 int ans[2010] = {}; int in = 0; for (int j = 0; j <= len_b-1; j++) { for (int i = 0; i <= len_a-1; i++) { ans[i+j] = a[i] * b[j] + in + ans[i+j]; in = ans[i+j] / 10; ans[i+j] %= 10; } // 最高位处理 ans[len_a+j] = in; in = 0; // 重置进位 } // 正常输出 int len_ans = len_a + len_b; // 结果的最大位数 // 前导0 while (ans[len_ans-1] == 0 && len_ans > 1) { len_ans--; } for (int i = len_ans - 1; i >= 0; i--) { cout << ans[i]; } return 0; }  三、高精度数的平方 #include <iostream> #include <cstring> using namespace std; int main() { // 存储并输出两个数字 char a_str[1005] = {}; char b_str[1005] = {}; cin >> a_str; strcpy(b_str, a_str); // 转换高精度数 int a[1005] = {}; int b[1005] = {}; int len_a = strlen(a_str); int len_b = strlen(b_str); for (int i = 0; i <= len_a-1; i++) { a[len_a-i-1] = a_str[i] - 48; } for (int i = 0; i <= len_b-1; i++) { b[len_b-i-1] = b_str[i] - 48; } // 计算 int ans[2010] = {}; int in = 0; for (int j = 0; j <= len_b-1; j++) { for (int i = 0; i <= len_a-1; i++) { ans[i+j] = a[i] * b[j] + in + ans[i+j]; in = ans[i+j] / 10; ans[i+j] %= 10; } // 最高位处理 ans[len_a+j] = in; in = 0; // 重置进位 } // 正常输出 int len_ans = len_a + len_b; // 结果的最大位数 // 前导0 while (ans[len_ans-1] == 0 && len_ans > 1) { len_ans--; } for (int i = len_ans - 1; i >= 0; i--) { cout << ans[i]; } return 0; } 四、高精度阶乘 #include <iostream> #include <cstring> using namespace std; int main() { // 输入 int n; cin >> n; // 初始化计算相关变量 int in = 0; int ans[10005] = {1}; int len_ans = 1; // 计算阶乘 for (int num = 1; num < n; num++) // num是对应的因数 { // 高精度数 ×低精度数代码 for (int i = 0; i <= len_ans-1; i++) { ans[i] = ans[i] * num + in; // ans[i] = 上一轮的结果 * 下一个因数 + 上一次的进位 in = ans[i] / 10; ans[i] %= 10; } while (in) { ans[len_ans] = in % 10; len_ans++; in /= 10; } } for (int i = 1; i <= len_ans; i++) { cout << ans[i]; } return 0; }

建议结合课程学习:

戳进课程入口>>

标签:

C++知识点总结(6):高精度乘法真题代码由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“C++知识点总结(6):高精度乘法真题代码