USACO代码解析Ordered Fractions (frac1)

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

描述

输入一个自然数N,对于一个最简分数a/b(分子和分母互质的分数),满足1<=b<=N,0<=a/b<=1,请找出所有满足条件的分数。

这有一个例子,当N=5时,所有解为:

0/1 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 1/1

给定一个自然数N,1<=n<=160,请编程按分数值递增的顺序输出所有解。

注:①0和任意自然数的最大公约数就是那个自然数②互质指最大公约数等于1的两个自然数。[编辑]格式

PROGRAM NAME: frac1

INPUT FORMAT:

(file frac1.in)

单独的一行一个自然数N(1..160)

OUTPUT FORMAT:

(file frac1.out)

每个分数单独占一行,按照大小次序排列

[编辑]SAMPLE INPUT

5

[编辑]SAMPLE OUTPUT

0/1

1/5

1/4

1/3

2/5

1/2

3/5

2/3

3/4

4/5

1/1

Methods:

快排

枚举所有的分数,判断其是否是最简(分母分子最大公约数=1),用一个数列记录所有最简分数,然后用排序。

[编辑]数学

来自Russ的更优算法:

我们可以把0/1和1/1作为“端点”,通过把两个分数的分子相加、分母相加得到的新分数作为中点来递归(如图)

0/1 1/1

1/2

1/3 2/3

1/4 2/5 3/5 3/4

1/5 2/7 3/8 3/7 4/7 5/8 5/7 4/5

每一个分数的分子和分母都是由求和得来的,这意味着我们可以通过判断和与N的大小关

系来判断递归边界。

<这是分数加成法!?数学上用于找一个无理数的近似分数>

#include

#include

using namespace std;

int n,a[100000],b[100000],len=0;

void swap(int &x,int &y)

{

int tmp=x;

x=y;

y=tmp;

}

int gcd(int x,int y) //判断是否互质!最后1/1=0返回1,1则互质{

if (x>y) swap(x,y);

if (x==0) return y;

return (gcd(y%x,x));

}

void sort(int l,int r)

{

int i=l,j=r;

float mid=(float)a[(i+j)/2]/(float)b[(i+j)/2];

for (;;)

{

for (;(float)a[i]/(float)b[i]

for (;(float)a[j]/(float)b[j]>mid;j--) {}

if (i<=j)

{

swap(a[i],a[j]);

swap(b[i],b[j]);

i++;

j--;

}

if (i>j) break;

}

if (l

if (i

}

int main()

{

ifstream fin("frac1.in");

ofstream fout("frac1.out");

fin>>n;

len++;

a[len]=0;

b[len]=1;

len++;

a[len]=1;

b[len]=1;

for (int i=2;i<=n;i++)

{

for (int j=1;j<=i-1;j++)

{

if (gcd(i,j)==1)

{

len++;

a[len]=j;

b[len]=i;

}

}

}

sort(1,len);

for (int i=1;i<=len;i++)

fout<

return 0;

}

或:

#include

#include

using namespace std;

int n;

void sch(int a1,int a2,int b1,int b2) // a1、b1为子,#2为母{

if (a1+b1>n || a2+b2>n) return;

else {

int m1=a1+b1,m2=a2+b2;

sch(a1,a2,m1,m2); //这里是为了顺序输出

cout<

sch(m1,m2,b1,b2); //..

}

}

int main(void)

{

freopen("frac1.in","r",stdin);

freopen("frac1.out","w",stdout);

cin>>n;

cout<<0<<"/"<<1<

sch(0,1,1,1);

cout<<1<<"/"<<1<

}

相关文档
最新文档