- char a_str[1005] = {};
- long long b;
- cin >> a_str >> b;
- 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];
- }
- if (a == 0 || b == 0)
- {
- cout << 0;
- return 0;
- }
- #include
- #include
- 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
- #include
- 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;
- }
首先我们要知道,n的平方(记作n²)相当于n ×n,其实我们可以按照高精度数 × 高精度数的思想来完成。
建议采用想法2,示例代码如下:
- #include
- #include
- 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
- #include
- 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是对应的因数(即3! = 1 * 2 * 3中的1、2、3)
- {
- // 高精度数 ×低精度数代码
- 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;
- }
这样,高精度就只剩下下周要研究的高精度除法啦( ̄︶ ̄)加油!