FOJ 1550 猪的分数

本题的主要思想是求最大公约数,如果为一,则求出分数的值后sort.

由于自己不懂怎么求最大公约数>_<.

导致了无数次Wrong Answer.

搞得我都有贴代码的冲动了。。。

下面是代码。

#include <iostream> #include <vector> #include <algorithm> using namespace std; struct num { char chu[10]; double result; }; bool my_sort(num a, num b) { return a.result<b.result; } //返回true说明有最大公约数a<b int HaveZuiDaGongYueShu(int a,int b) { if(a%b == 0) return b; else return HaveZuiDaGongYueShu(b,a%b); } int main() { vector<num> t_vec; int n,i,j; num nnn; vector<num>::iterator it; while (scanf("%d", &n) != EOF) { for (i=1;i<=n;i++) { for (j=1;j<=i;j++) { if (HaveZuiDaGongYueShu(j,i) == 1) { nnn.result = (double)j/(double)i; sprintf(nnn.chu, "%d/%d", j, i); t_vec.push_back(nnn); } } } sort(t_vec.begin(), t_vec.end(), my_sort); it = t_vec.begin(); printf("0/1/n"); for (;it != t_vec.end();it++) printf("%s/n", it->chu); t_vec.clear(); } return 0; }

 

另外,还发现一种更好的方法。

此法被称为法雷序列。

由于范围小 最简单的方法是枚举所有真分数,判断是否最简,然后qsort。

或者可以采用如下构造法

首先写上
0/1 1/1
然后每次在所有数中间填加一个分子分母分别等于旁边2数和的。

0/1 1/2 1/1
1/0 1/3 1/2 2/3 1/1
……
具体实现采用递归,当分母超过给定值也就是递归出口。

代码如下

 

#include<stdio.h> int i,n; void f(int a,int b,int c,int d) { if(b+d>n) return ; f(a,b,a+c,b+d); printf("%d/%d/n",a+c,b+d); f(a+c,b+d,c,d); } int main() { while(scanf("%d",&n)!=EOF) { puts("0/1"); f(0,1,1,1); puts("1/1"); } return 0; }

你可能感兴趣的:(c,iterator)