USACO 2.1

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值