分数化简(fen)

问题描述
一个分数一般写成两个整数相除的形式:N/M,其中 M 不为 0。最简分数是指分 子和分母的最大公约数为 1 的分数表示形式。现在给你 N 和 M 的值,请输出他们的最简 分数的值。如果化简后分母为 1,则输出分子的值。例如:N=8,M=6,你应该输出 4/3, 若 N=8,M=2,则你应该输出 4。
输入格式
一行包括 2 个正整数 N和MN 和 MNM
输出格式
形如 N/M 的最简分数,若分母为 1,则输出分子的值。
输入样例 1

8 6

输出样例 1

4/3

输入样例 2

8 4

输出样例 2

2

数据范围
25%数据 N,M≤2∗106N, M \le 2 * 10 ^ 6N,M2106
100% 数据,N,M<=1010N, M <= 10^{10}N,M<=1010
代码

#include <bits/stdc++.h>
using namespace std;
long long n, m, g, fm, fz;
int main() {
	cin >> n >> m;
	g = __gcd(n, m);
	fz = n / g;
	fm = m / g;
	if (fm == 1)
		cout << fz;
	else
		cout << fz << '/' << fm;

	return 0;
}
<think>好的,我需要用C++编写一个生成两个不超过100的整数的除法题,要求能够整除。首先,我得分析需求,明确问题。 题目要求两个数相除且能整除,所以被除数必须是除数的整数倍。而且两个数都不超过100,那除数最大是100,但被除数需要考虑是除数的倍数,所以实际范围可能更小。 接下来,我需要确定如何生成符合条件的两个数。可能的思路是先随机生成除数,然后生成它的倍数作为被除数,或者反过来。但要注意不超过100的限制。 比如,如果先随机生成除数d,范围是1到100,然后生成倍数k,使得k*d <=100。但这样可能导致d较大时,k只能是1,比如d=99,k只能是1,这样被除数也是99,可能题目太简单。或者,可能需要让k有一定的范围,比如k至少为2,但这样当d=50时,k只能是2,否则超过100。这可能限制较多。 或者,另一种方法是先随机生成商k,然后随机生成除数d,使得被除数k*d <=100。这样商k可以有一定范围,比如k的范围是1到100,但需要保证d不为0,且k*d <=100。这种方法可能更灵活,但需要确保d和k的组合有效。 比如,如果k=3,那么d的范围是1到floor(100/3)=33,所以d可以是1到33中的随机数,被除数就是3*d,范围3到99。 这种方法的好处是商k可以控制题目难度,比如k小的话,题目更简单,k大的话可能需要更大的数。不过用户没有特别要求难度,所以可能不需要区分。 不过,用户的需求是生成两个数相除能整除,所以无论哪种方法,关键是确保被除数是除数的整数倍,且都不超过100。 接下来,我需要考虑随机数的生成。C++中使用rand()函数,但需要先设置种子,比如用srand(time(0))来初始化随机数生成器。 可能的步骤: 1. 生成一个除数d(1到100之间的随机数,因为除数不能为0) 2. 生成商k(至少1,且k*d <=100) 3. 被除数为k*d 4. 输出题目:被除数 ÷ 除数 = ? 但如何确定k的范围?比如,当d确定后,k的最大值是floor(100/d)。所以,可以先生成d,然后k在1到floor(100/d)之间随机选择。这样被除数k*d不会超过100。 或者,先生成k,再生成d,使得d <= 100/k。但k不能超过100,因为当k=100时,d只能是1。 两种方法都可以,可能先选择除数再选择商更容易实现。 比如: d = rand() % 100 + 1; // 1到100 max_k = 100 / d; k = rand() % max_k + 1; // 1到max_k 被除数 = k * d; 这样得到的被除数肯定不超过100,且能整除。 但这样可能导致当d较大的时候,k只能是1,比如d=80,max_k=1,所以k只能是1,这样题目是80 ÷80=1,可能太简单。不过这是符合要求的,但可能用户希望题目有一定的难度,比如商至少是2?或者用户没有特别要求,所以只要符合条件即可。 不过用户需求是“能整除”,没有限制商的大小,所以可以接受k=1的情况。 这样,代码的大致流程是: - 生成d(1-100) - 计算max_k = 100 / d - 生成k(1到max_k) - 被除数 = k*d - 输出题目:被除数 ÷ 除数 = ? 这样就能确保被除数和除数都不超过100,且能整除。 接下来,编写代码。需要注意的是,C++的rand()函数生成的随机数范围,以及如何处理余数。 代码示例: #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { srand(time(0)); // 初始化随机种子 int divisor, dividend, quotient; // 生成除数,1到100 divisor = rand() % 100 + 1; // 计算最大可能的商 int max_quotient = 100 / divisor; // 生成商,1到max_quotient quotient = rand() % max_quotient + 1; // 计算被除数 dividend = quotient * divisor; cout << dividend << " ÷ " << divisor << " = ?" << endl; return 0; } 这样,每次运行程序都会生成一个符合条件的题目。例如,当divisor=25,max_quotient=4,可能生成商为3,被除数为75,题目是75 ÷25=3。 测试一些边界情况: 如果divisor=100,max_quotient=1,商只能是1,被除数=100,题目是100 ÷100=1。 如果divisor=1,max_quotient=100,商可以是1到100之间的随机数,被除数就是商的值,比如商=50,被除数是50,题目是50 ÷1=50。 另一个情况,divisor=3,max_quotient=33,商可以是1-33,比如商=10,被除数是30,题目是30 ÷3=10。 这样满足所有条件。 可能需要注意,当max_quotient为0的情况?但divisor最小是1,所以max_quotient=100/1=100,不会出现0。因此代码是安全的。 此外,用户可能需要题目中的两个数都是随机的,而不是固定除数再生成商。但按照上述方法,确实满足条件。 不过,这样的方法可能导致除数较大的情况下,商总是1,这可能让题目比较单调。比如,当divisor在50到100之间时,max_quotient只能是1,所以商只能是1,被除数等于除数。这样的题目可能重复较多。 例如,divisor=50,商只能是1或2?因为50*2=100,所以max_quotient=100/50=2。所以商可以是1或2。例如,商2时被除数是100,题目是100 ÷50=2。 哦,之前的代码中,max_quotient = 100 / divisor。比如divisor=50,100/50=2,所以商可以是1或2。rand() % 2 +1,即生成1或2。 所以当divisor=50时,可能生成商1或2,被除数为50或100。 所以之前的代码没有问题,只是当divisor较大时,商的范围可能较小,但这是合理的。 另一种情况,divisor=33,max_quotient=3(因为33*3=99),所以商可以是1、2、3。这样被除数可能是33、66、99。 这样生成的题目更具多样性。 综上,代码逻辑正确,可以满足用户需求。</think>以下是使用C++实现的随机生成两个不超过100且能整除的除法题的程序: ```cpp #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { srand(time(0)); // 初始化随机数种子 int divisor = rand() % 100 + 1; // 生成1-100的除数 int max_quotient = 100 / divisor; // 计算最大商值 int quotient = rand() % max_quotient + 1; // 生成1-max_quotient的商 int dividend = divisor * quotient; // 计算被除数 cout << "题目:" << dividend << " ÷ " << divisor << " = ?" << endl; cout << "答案:" << quotient << endl; return 0; } ``` **实现原理分步说明:** 1. **随机数初始化** ```cpp srand(time(0)); // 用当前时间作为随机数种子 ``` - 确保每次运行程序时生成不同的随机数 2. **生成除数** ```cpp int divisor = rand() % 100 + 1; // 1-100的随机整数 ``` - `rand() % 100` 生成0-99的随机数 - `+1` 后范围变为1-100 3. **计算最大商值** ```cpp int max_quotient = 100 / divisor; ``` - 确保被除数不超过100:`商 = 被除数 / 除数 ≤ 100 / 除数` 4. **生成有效商值** ```cpp int quotient = rand() % max_quotient + 1; // 1-max_quotient的随机整数 ``` - 例如:当除数为25时,最大商为4(25×4=100) 5. **计算被除数** ```cpp int dividend = divisor * quotient; ``` - 保证被除数一定是除数的整数倍 **示例输出:** ``` 题目:84 ÷ 28 = ? 答案:3 ``` **程序特点:** - 完全避免除法余数 - 被除数范围:1-100 - 除数范围:1-100 - 保证商为整数结果 - 每次运行生成不同题目 **扩展建议:** 1. 可增加循环生成多个题目 2. 可添加用户输入验证功能 3. 可限制商的最小值(如≥2)提升难度 4. 可添加分数计算功能处理不能整除的情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值