列出最简真分数序列

描述

按递增顺序依次列出所有分母为N(10 <= N <= 40),分子小于N的最简分数。‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

输入

分母 N。‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

输出

分数之间用逗号分开(含最末逗号)‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

输入输出示例

输入输出
示例 1
10
1/10,3/10,7/10,9/10,

 

 

#include<stdio.h>
//主要讲解 本题要求输出最简分数,如果输入n为10
//则输出得分数分别是1/10,3/10,7/10,9/10
//我们要发现规律,为什么2/10, 4/10,5/10,6/10,8/10
//这些数被去掉了呢,因为他们能约分,都公约数,仔细观察
//2是同时被 2/10的2和10约分掉,2也能被4/10 的4和10约掉
//这些是他们得最小公约数 
//最小被公约数是从2到n-1这个范围
//该题j为从2开始依次递增寻找最小公约数 
//若一个数同时能被分子和分数整除的,则这个数是它的最小公约数 
//若找到则标记
//后面再根据标记的判断去输入最简分数 
int main()
{
	int n,i,j=2,flat=0;
	scanf("%d",&n);
	for(i=1;i<n;i++)
	{
		for(j=2;j<n;j++)
		{
			if(i%j==0&&n%j==0)
			   flat=1;
		
		}
			if(flat==0)
			{
				printf("%d/%d,",i,n);
			}flat=0;
			
		
		
	}
	
 } 

以下是解决该问题的C++代码,基于欧拉函数计算真分数的数量,并找到升序序列中的第 k 项: ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; // 计算大公约数 int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } // 判断是否为真分数 bool isSimplestFraction(int numerator, int denominator) { return gcd(numerator, denominator) == 1 && numerator < denominator; } int main() { int a, b, k; cin >> a >> b >> k; vector<pair<int, int>> fractions; // 存储所有符合条件的真分数 // 遍历每个可能的分母 d 和分子 n 的组合 for (int d = a; d <= b; ++d) { // 分母从 a 到 b for (int n = 1; n < d; ++n) { // 分子小于分母开始 if (isSimplestFraction(n, d)) { fractions.emplace_back(make_pair(n, d)); // 如果是真分数则加入集合 } } } // 对所有真分数按大小排序 sort(fractions.begin(), fractions.end(), [](const pair<int, int>& x, const pair<int, int>& y) -> bool { return (long long)x.first * y.second < (long long)y.first * x.second; }); cout << fractions.size() << endl; // 输出总数 if (k > 0 && k <= fractions.size()) { // 确保 k 在有效范围内 cout << "The " << k << " item=" << fractions[k - 1].first << "/" << fractions[k - 1].second << endl; } else { cout << "Invalid k value." << endl; } return 0; } ``` ### 运行说明: 1. 输入 `a`, `b`, `k` 表示分母范围 `[a, b]` 及所需的第 k 项; 2. 使用嵌套循环遍历所有的 `(numerator, denominator)` 组合; 3. 应用 `gcd()` 函数判断是否满足条件; 4. 将结果存储到向量中并按照值排序; 5. 终输出总个数以及第 k 项。 --- **注意点:** - 当数据规模较大时(例如较大的 `b` 值),此解法的时间复杂度较高。若需优化效率,可通过 **欧拉筛法** 或者提前缓存一些数学性质加速运算。 - 若输入非法或超出范围,应返回提示信息而非错误崩溃。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值