the reason of failure:1、考试前看了一遍题意,但是不知道为什么提交失败了,不是答案错误,然后今天直接一遍过。
thinking:可以2个for嵌套,for(i=1;i<=n;i++)for(j=i;j<=n;j++)用一个stucture 储存,j做分母,i做分子,就把所有分子小于分母且其最大公约数是1的数全部储存了,
然后用qsort排序,对分数a>b排序就相当与a的分子*b的分母>b的分子*a的分母来排。
learning:1、对分数排序,分数大小比较的方法。
2、qsort的第二个变量是长度而不是数组+长度,sort才是数组+长度。
3、对于qq[t1++].a=x.qq[t1].b=y。这样的储存并不是储存在一个qq里面,因为第二个的t1已经发生改变了。
代码:
/*
ID: me
PROG: frac1
LANG: C++
*/
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
struct ttt{
int a,b;
};
ttt qq[160*160];
int gcd(int a,int b){
return a==0?b:gcd(b%a,a);
}
int cmp1(const void *a,const void *b){
return (*(ttt*)a).a*(*(ttt*)b).b-(*(ttt*)a).b*(*(ttt*)b).a;
}
int main(){
freopen("frac1.in","r",stdin);
freopen("frac1.out","w",stdout);
int a,b,c,f1,f2,f3,i,j,k,t1,t2,t3;
int n,m;
memset(qq,0,sizeof(qq));
cin >> n;
t1=0;
for(i=1;i<=n;i++)
for(j=i;j<=n;j++) //这里是为了确保分母必定比分子大,但是相同的时候其最大公约数不是1.
if(gcd(i,j)==1){
qq[t1].a=i; //0,0也在里面
qq[t1].b=j;
t1++; //3、注意如果2个数组前面那个是qq[t1++].a=,qq[t1].b=。这么写会造成存入
//的不是同一个qq里面!!
}
//for(i=0;i<t1;i++)
// cout << qq[i].a <<" " << qq[i].b<<endl;
//cout << "新的是"<< endl;
qsort(qq,t1,sizeof(ttt),cmp1); //qsort的第二个变量是长度而不是原数组+长度
cout <<"0/1"<<endl;
for(i=0;i<t1;i++)
cout << qq[i].a <<"/" << qq[i].b<<endl;
return 0;
}