输入一个自然数 N 请写一个程序来增序输出分母小于等于 N 的既约真分数
输入格式:
单独的一行 一个自然数 N(1…160)
输出格式:
每个分数单独占一行
输入样例1:
在这里给出一组输入。例如:
5
输出样例1:
在这里给出相应的输出。例如:
0/1
1/5
1/4
1/3
2/5
1/2
3/5
2/3
3/4
4/5
1/1
输入样例2:
4
输出样例2:
0/1
1/4
1/3
1/2
2/3
3/4
1/1
输入样例3:
10
输出样例3:
0/1
1/10
1/9
1/8
1/7
1/6
1/5
2/9
1/4
2/7
3/10
1/3
3/8
2/5
3/7
4/9
1/2
5/9
4/7
3/5
5/8
2/3
7/10
5/7
3/4
7/9
4/5
5/6
6/7
7/8
8/9
9/10
1/1
【思路】
1.一个分数值只对应一种既约真分数形式,与map中的 key-value 的一一对应关系相同,
且每个分数值都是唯一的,而 map 中的 key 也是唯一的。
故我使用map,把 “分数值” 作为 map 中的key,把 “分数形式” 作为map中的value,
储存为 “分数值-分数形式” 对;
2.为了保证 分数形式 为 即约真分数形式
利用map的覆盖功能,在遍历的同时更新 分数的形式;
3.map会自动对键进行从小到大排序
便于按从小到大顺序,遍历输出结果;
【源代码】
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
float n;
cin >> n;
map<float, string> Map; // 创建一个 map,分数值作为 key, 分数形式作为 value;
Map[0] = "0/1"; // 特定储存两个数据:(1)0/1, (2)1/1 = n/n;
Map[1] = "1/1";
float frac = 0; // 分数的值
for (float i = n; i > 1; i--) // i:分母
{
for (float j = 1; j < n; j++) // j:分子
{
frac = j / i;
if (frac < 1) // 保证储存key的是真分数
{
Map[frac] = (to_string((int)j)) + "/" + (to_string((int)i)); // 更新分数值对应的真分数形式,保证该真分数为既约真分数;
}
}
}
map<float, string>::iterator iter;
for (iter = Map.begin(); iter != Map.end(); iter++)
{
cout << iter->second << endl;
}
return 0;
}