问题描述 :
输入一个自然数N,请写一个程序来增序输出分母小于等于N的既约真分数(即无法再进行约分的小于1的分数)
输入说明 :
单独的一行,一个自然数N(1…20)
输出说明 :
每个分数单独占一行
按照分数大小升序排列
对于分子为0的分数,仅输出0/1,不输出其它分母的分数,比如0/2, 0/3。
输入范例 :
4
输出范例 :
0/1
1/4
1/3
1/2
2/3
3/4
问题解析:
创建分数,然后排序。注意冒泡排序中3/4会跑到6/8后边,因此需要排序特殊处理
具体代码:
#include <iostream>
#include<iomanip>
#include <cmath>
#include<bits/stdc++.h>
#include <stack>
#include<string>
using namespace std;
struct Fraction{
double value;
double son;
double mother;
};
int main(){
int m;
cin>>m;
Fraction a[1000];
//分母为1的就一个,分子为0的也就一个,提前处理了。
a[0].son=0;
a[0].mother=1;
a[0].value=a[0].son/a[0].mother;
int r=1;
//创建所有的合格分数
for(double i=2;i<=m;i++){
for(double j=1;j<i;j++){
a[r].son=j;
a[r].mother=i;
a[r].value=j/i;
r++;
}
}
for(int i=1;i<r;i++)
for(int j=i+1;j<r;j++)
{
if(a[j].value<a[i].value)
{
Fraction temp=a[j];
a[j]=a[i];
a[i]=temp;
}
else if(a[j].value==a[i].value&&a[j].son<a[i].son){
Fraction temp=a[j];
a[j]=a[i];
a[i]=temp;
}
}
cout<<a[0].son<<"/"<<a[0].mother<<endl;
double prevalue=a[0].value;
for(int i=1;i<r;i++){
if(a[i].value!=prevalue)
{
cout<<a[i].son<<"/"<<a[i].mother<<endl;
prevalue=a[i].value;
}
}
return 0;
}