原题链接:
截止到现在今天AC了两道题,不想做了,整理一下这几天做的吧!
好吧,想说这道题好水啊!
题意:题目给出一个自然数N(1<=N<=160),要求增序输出分母小于等于N的既约真分数。
思路:先用两个for循环来得到分子和分母,然后判断他们是不是互质的,若是则存入数组中。找到所有的真分数后,再对数组根据分子/分母的商进行排序。然后输出就ok了。
注意:1、分母不可以为零,要先排除这种情况在进行排序前的计算。
2、0/1和1/1也属于真分数,要进行输出。
源代码:
/*
ID: supersnow0622
PROG: frac1
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string>
#include<algorithm>
using namespace std;
struct Frac
{
int a,b;
double c;
};
Frac frac[100000];
bool isFrac(int a,int b)
{
int temp;
if(b==0)
{
if(a==1) return true;
else return false;
}
while(a%b!=0)
{
temp=a%b;
a=b;
b=temp;
}
if(b==1)
return true;
else
return false;
}
int cmp(Frac f1,Frac f2)
{
if(f1.c==f2.c)
return f1.a<f2.a;
else
return f1.c<f2.c;
}
int main() {
ofstream fout ("frac1.out");
ifstream fin ("frac1.in");
int N;
cin>>N;
int count=0;
for(int i=1;i<=N;i++)
for(int j=0;j<i;j++)
{
if(isFrac(i,j))
{
frac[count].a=j;
frac[count].b=i;
frac[count++].c=1.0*j/i;
}
}
sort(frac,frac+count,cmp);
for(int i=0;i<count;i++)
cout<<frac[i].a<<"/"<<frac[i].b<<endl;
cout<<"1/1"<<endl;
return 0;
}