问题标题: 酷町堂:2638 分数排序

0
0
已解决
李瑞曦
李瑞曦
高级天翼
高级天翼

2638   分数排序经验值:1200

题目描述 Description

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

输入描述 Input Description

一行,一个自然数,N

输出描述 Output Description

每行一个分数,按从小到大的顺序出现

样例输入 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

-----------------------------------------------------------------------------------------------------------------------------------

求大佬来帮助,采纳时加到70酷町豆!

#include<iostream>
#include<algorithm>
using namespace std;
struct dddd{
    int m,z,s;
}a[111111];
bool gcd(int x,int y){
    int s;
    for(int i=1;i<=max(x,y);++i)
    {
        if(x%i==0&&y%i==0)
            s=i;
    }
    if(s==1) return true;
    return false; 
}
bool cmp(dddd x,dddd y){
    return x.s<y.s;
}
int main(){
    int n,x=1;
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=0;j<=i;j++){
            if(gcd(i,j)){
                x++;
                a[x].m=i;
                a[x].z=j;
                a[x].s=j*1.0/i;
            }
        }
    }
    sort(a+1,a+x,cmp);
    for(int i=1;i<x;i++){
        cout<<a[i].z<<"/"<<a[i].m<<endl;
    }
    return 0;
}//我是按照李鑫羽的核心写的

@李鑫羽@柯以成      帮我看看!!!

李瑞曦在2020-07-14 17:30:38追加了内容

😭😭😭😭我太难了

李瑞曦在2020-07-14 17:40:26追加了内容
#include<iostream>
#include<algorithm>
using namespace std;
int cnt;
int gcd(int x,int y){ 
    int r;
    while(x%y!=0){
        r=x%y;
        x=y;
        y=r;
    }
    return y;
}
struct fs{
    int jg,fm,fz;
}a[10070];
bool cmp(fs s,fs d){
    return s.jg<d.jg;
}
int main(){
    int n;
    cin>>n;
    cout<<0<<"/"<<1<<endl;
    for(int i=1;i<=n;i++){
        for(int j=n;j>=i+1;j--){
            double k=i*1.0/j;
            if(i==1){
                cnt++;
                a[i].jg=1.0*i/j;
                a[i].fm=i;
                a[i].fz=j;
            }
            else if(gcd(i,j) && k<=1){
                cnt++;
                a[i].jg=1.0*i/j;
                a[i].fm=i;
                a[i].fz=j;
            }
        }
    }
    sort(a+1,a+cnt+1,cmp);
    for(int i=1;i<=cnt;i++){
        cout<<a[i].fz<<"/"<<a[i].fm<<endl;
    }
    cout<<1<<"/"<<1; 
    return 0;
}

 

李瑞曦在2020-07-14 17:40:51追加了内容

@柯以成 

李瑞曦在2020-07-14 17:44:09追加了内容
#include<iostream>
#include<algorithm>
using namespace std;
struct dddd{
    int m,z,s;
}a[111111];
bool gcd(int x,int y){
    int s;
    for(int i=1;i<=max(x,y);++i)
    {
        if(x%i==0&&y%i==0)
            s=i;
    }
    if(s==1) return true;
    return false; 
}
bool cmp(dddd x,dddd y){
    return x.s<y.s;
}
int main(){
    int n,x=1;
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=0;j<=i;j++){
            if(gcd(i,j)){
                x++;
                a[x].m=i;
                a[x].z=j;
                a[x].s=j*1.0/i;
            }
        }
    }
    sort(a+1,a+1+x,cmp);
    for(int i=1;i<=x;i++){
        cout<<a[i].z<<"/"<<a[i].m<<endl;
    }
    return 0;
}

 

李瑞曦在2020-07-14 18:12:27追加了内容

啊啊啊啊啊啊啊啊

我要残了!!!!!555~


0
已采纳
柯以成
柯以成
新手光能
新手光能

结构体中

s应该为double类型

0
柯以成
柯以成
新手光能
新手光能

看我回答李素颜的

你跟她错的差不多

对了采纳我

0
柯以成
柯以成
新手光能
新手光能

for(int i=1;i<x;i++){

 

cout<<a[i].z<<"/"<<a[i].m<<endl;

 

}

你这个,把i<x改成i<=x

还有sort(a+1,a+x,cmp);

改成sort(a+1,a+x+1,cmp);

柯以成在2020-07-14 17:42:00追加了内容

@李瑞曦 

0
柯以成
柯以成
新手光能
新手光能

你那个i==1没加,就是i==1都成立那个

 

0
柯以成
柯以成
新手光能
新手光能

你把函数换成这个试试

int duan(int a,int b,int n)
{
    for(int i=2;i<=n;i++)
    {
        if(a%i==0&&b%i==0)
            return 0;
    }
    return 1;
}

 

0
柯以成
柯以成
新手光能
新手光能

n是输入的n

duan(i,j,n)这样传参

0
0
0
柯以成
柯以成
新手光能
新手光能

代码核心

   for(i=1;i<n;i++)
    {
        for(j=i+1;j<=n;j++)
        {
            if(i==1)
            {
                nn[k].a=i;
                nn[k].b=j;
                nn[k].s=1.00*i/j;
                k++;
            }
            else if(duan(i,j,n))
            {
                nn[k].a=i;
                nn[k].b=j;
                nn[k].s=1.00*i/j;
                k++;
            }
        }
    }
    sort(nn,nn+k,cmp);

cout<<"0/1"<<endl;

输出把1改成0

 

i<cnt

cout<<"1/1"<<endl;

nn是结构体数组

0
0
0
李瑞曦
李瑞曦
高级天翼
高级天翼

天哪,为什么还是错的!!!

#include<iostream>
#include<algorithm>
using namespace std;
struct dddd{
    int a,b,s;
}nn[111111];
int duan(int a,int b,int n)
{
    for(int i=2;i<=n;i++)
    {
        if(a%i==0&&b%i==0)
            return 0;
    }
    return 1;
}
bool cmp(dddd x,dddd y){
    return x.s<y.s;
}
int main(){
    int n,k=1;
    cin>>n;
    cout<<"0/1"<<endl;
    for(int i=1;i<n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            if(i==1)
            {
                nn[k].a=i;
                nn[k].b=j;
                nn[k].s=1.00*i/j;
                k++;
            }
            else if(duan(i,j,n))
            {
                nn[k].a=i;
                nn[k].b=j;
                nn[k].s=1.00*i/j;
                k++;
            }
        }
    }
    sort(nn,nn+k,cmp);
    for(int i=1;i<=k;i++){
        cout<<nn[i].a<<"/"<<nn[i].b<<endl;
    }
    cout<<"1/1"<<endl;
    return 0;
}

 

0
柯以成
柯以成
新手光能
新手光能

你cout<<"0/1"<<endl;没输出

在最前面

0
柯以成
柯以成
新手光能
新手光能

for(int i=1;i<=k;i++){

改成i=0;i<k

0
柯以成
柯以成
新手光能
新手光能

我跟你写的一样啊

我再看看

0
柯以成
柯以成
新手光能
新手光能

我知道了

int n,k=1;

k应该=0;

0
李瑞曦
李瑞曦
高级天翼
高级天翼
#include<iostream>
#include<algorithm>
using namespace std;
struct dddd{
    int a,b,s;
}nn[111111];
int duan(int a,int b,int n)
{
    for(int i=2;i<=n;i++)
    {
        if(a%i==0&&b%i==0)
            return 0;
    }
    return 1;
}
bool cmp(dddd x,dddd y){
    return x.s<y.s;
}
int main(){
    int n,k=0,i,j;
    cin>>n;
    cout<<"0/1"<<endl;
    for(i=1;i<n;i++)
    {
        for(j=i+1;j<=n;j++)
        {
            if(i==1)
            {
                nn[k].a=i;
                nn[k].b=j;
                nn[k].s=1.00*i/j;
                k++;
            }
            else if(duan(i,j,n))
            {
                nn[k].a=i;
                nn[k].b=j;
                nn[k].s=1.00*i/j;
                k++;
            }
        }
    }
    sort(nn,nn+k,cmp);
    for(int i=0;i<k;i++){
        cout<<nn[i].a<<"/"<<nn[i].b<<endl;
    }
    cout<<"1/1"<<endl;
    return 0;
}

 

我要回答