一、高精度数 ÷ 低精度数
戳此处进入课程入口
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
// 存储并输入
char a_str[1005] = {};
int b;
cin >> a_str >> b;
// 转换
int a[1005] = {};
int len_a = strlen(a_str);
for (int i = 0; i <= len_a-1; i++)
{
a[i] = a_str[i] - 48; // 正序存储
}
// 计算
int len_ans = len_a; // 计算次数
int ans[1005] = {};
int rem = 0; // 余数
for (int i = 0; i <= len_ans-1; i++)
{
ans[i] = (rem * 10 + a[i]) / b; // 写商
rem = (rem * 10 + a[i]) % b; // 写余
}
// 去前导零
int k = 0; // k 表示第一个不为 0 元素的下标
while (ans[k] == 0 && k < len_ans-1)
{
k++;
}
// 正常正序输出
for (int i = k; i <= len_ans-1; i++)
{
cout << ans[i];
}
return 0;
}
二、高精度数 ÷ 低精度数,保留指定位数
戳此处进入课程入口
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
// 存储并输入
char a_str[1005] = {};
int b;
int point; // 保留小数的数位
cin >> a_str >> b >> point;
// 转换
int a[1005] = {};
int len_a = strlen(a_str);
for (int i = 0; i <= len_a-1; i++)
{
a[i] = a_str[i] - 48; // 正序存储
}
// 计算
int len_ans = len_a; // 计算次数
int ans[2100] = {};
int rem = 0; // 余数
for (int i = 0; i <= len_ans+point-1; i++)
{
ans[i] = (rem * 10 + a[i]) / b; // 写商
rem = (rem * 10 + a[i]) % b; // 写余
}
// 去前导零
int k = 0; // k 表示第一个不为 0 元素的下标
while (ans[k] == 0 && k < len_ans-1)
{
k++;
}
// 正常正序输出整数部分
for (int i = k; i <= len_ans-1; i++)
{
cout << ans[i];
}
// 小数点后判断
if (point > 0)
{
cout << ".";
for (int i = len_ans; i <= len_ans+point-1; i++)
{
cout << ans[i];
}
}
return 0;
}
三、高精度数的真因子
戳此处进入课程入口
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
// 存储并输入
string a_str;
int b;
cin >> a_str >> b;
// 特例先行:两数相等的情况
if (a_str == to_string(b))
{
cout << "no";
return 0;
}
// 转换
int a[1005] = {};
int len_a = a_str.length();
for (int i = 0; i <= len_a-1; i++)
{
a[i] = a_str[i] - 48; // 正序存储
}
// 计算
int len_ans = len_a; // 计算次数
int ans[1005] = {};
int rem = 0; // 余数
for (int i = 0; i <= len_ans-1; i++)
{
ans[i] = (rem * 10 + a[i]) / b; // 写商
rem = (rem * 10 + a[i]) % b; // 写余
}
cout << (!rem ? "yes" : "no");
return 0;
}
四、高精度求梯形的面积
戳此处进入代码中的2.讲解
戳此处进入代码中的3.讲解
戳此处进入代码中的4.讲解
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
// 1. 输入梯形的上底长度、下底长度和高的长度
char a_str[1005] = {};
char b_str[1005] = {};
char h_str[1005] = {};
cin >> a_str >> b_str >> h_str;
// 2. 计算上底a + 下底b的结果
// 2.1 转换并存储两个字符数组a和b
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;
}
// 2.2 计算
int sum[2010] = {};
int len_sum = max(len_a, len_b);
int in = 0;
for (int i = 0; i <= len_sum-1; i++)
{
sum[i] = a[i] + b[i] + in;
in = sum[i] / 10;
sum[i] %= 10;
}
// 2.3 补进位
if (in)
{
sum[len_sum] = in;
len_sum++;
}
// 3. 计算底和sum × 高h的结果
// 3.1 转换并存储数组h
int h[1005] = {};
int len_h = strlen(h_str);
for (int i = 0; i <= len_h-1; i++)
{
h[len_h-i-1] = h_str[i] - 48;
}
// 3.2 计算
int pro[2010] = {};
int pin = 0;
for (int j = 0; j <= len_h-1; j++)
{
for (int i = 0; i <= len_sum-1; i++)
{
pro[i+j] = sum[i] * h[j] + pin + pro[i+j];
pin = pro[i+j] / 10;
pro[i+j] %= 10;
}
// 最高位存储
pro[len_sum+j] = pin;
pin = 0;
}
// 3.3 位数调整
int len_pro = len_sum + len_h;
while (pro[len_pro-1] == 0 && len_pro > 1)
{
len_pro--;
}
// 4. 计算最终结果
// 4.1 倒序数组
int prd[2010] = {};
int len_prd = len_pro;
for (int i = 0; i <= len_prd-1; i++)
{
prd[len_prd-i-1] = pro[i];
}
// 4.2 计算
int ans[2010] = {};
int len_ans = len_pro;
int rem = 0;
for (int i = 0; i <= len_ans-1; i++)
{
ans[i] = (rem * 10 + prd[i]) / 2; // 写商
rem = (rem * 10 + prd[i]) % 2; // 取余
}
// 4.3 去前导零
int k = 0;
while (ans[k] == 0 && k < len_ans-1)
{
k++;
}
// 5. 输出结果
for (int i = k; i <= len_ans-1; i++)
{
cout << ans[i];
}
return 0;
}