C++知识点总结(6):高精度除法相关真题

一、高精度数 ÷ 低精度数

戳此处进入课程入口

#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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值