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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值