Section 2.1 frac1

来源:互联网 发布:数据新闻啥意思 编辑:程序博客网 时间:2024/06/07 16:57

题目大意

    输入一个自然数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的两个自然数。

输入格式

line 1:N(1<N<160)

输出格式

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

样例输入

5

样例输出

0/1  1/5  1/4  1/3  2/51/23/52/33/44/51/1

题解

比较水的一题,判断最大公因数是否为1即可。判断的时候避免受double的精度影响,变换成整数比较大小比较好。

代码

#include<stdio.h>int gcd(int a,int b){    int i,j,r;    if(a==0)        return b;    if(b==0)        return a;    if(a>b)    {        i=a;        j=b;    }    else    {        i=b;        j=a;    }    do    {        r=i%j;        i=j;        j=r;    }while(r!=0);    return i;}int main(){    int N;    int i,j,k=0,t;    int a[20000][2]={0};    double b[20000]={0};    scanf("%d",&N);    for(i=0;i<=N;i++)        for(j=i;j<=N;j++)        {            if(gcd(i,j)==1)            {                double p,q;                p=i;                q=j;                b[k]=p/q;                a[k][0]=i;                a[k][1]=j;                k++;            }        }        for(i=0;i<k;i++)            for(j=0;j<k-i-1;j++)            {                if(b[j]>b[j+1])                {                    double h;                    h=b[j];                    b[j]=b[j+1];                    b[j+1]=h;                    t=a[j][0];                    a[j][0]=a[j+1][0];                    a[j+1][0]=t;                    t=a[j][1];                    a[j][1]=a[j+1][1];                    a[j+1][1]=t;                }            }            for(i=0;i<k;i++)            {                printf("%d/%d\n",a[i][0],a[i][1]);            }    return 0;}