给定一个正整数N,由所有分母小于或等于N的最简真分数按从小到大组成一个序列。
例如:N=5,
1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4/5
编一个程序,输入一个正整数,输出上述序列。
求两数最大公约数
int gys(int a,int b)
{
if(a%b==0) return b;
else return (b,a%b);
}
解题思路:
模拟,链表实现。
链表操作起来确实有点头疼啊。。
typedef struct Node
{
int fz;
int fm;
Node* next;
}*List;
List head=(List)malloc(sizeof(Node));//初始化头结点
head->fz=0;
head->fm=1;
head->next=NULL;
p=(List)malloc(sizeof(Node));//申请新节点
p->fz=j/gys(i,j);//化简分子
p->fm=i/gys(i,j);//化简分母
p->next=q->next;
代码如下:
#include<stdio.h>
#include<algorithm>
typedef struct Node
{
int fz;
int fm;
Node* next;
}*List;
int gys(int a,int b)
{
if(a%b==0) return b;
else return (b,a%b);
}
int main()
{
int n;
List head=(List)malloc(sizeof(Node));//初始化头结点
head->fz=0;
head->fm=1;
head->next=NULL;
List p,q;//p为新节点指针,q为链表遍历指针
while(~scanf("%d",&n))
{
head->next=NULL;
for(int i=1;i<=n;i++)//循环遍历分母
{
for(int j=1;j<i;j++)//循环遍历分子
{
p=(List)malloc(sizeof(Node));//申请新节点
p->fz=j/gys(i,j);//化简分子
p->fm=i/gys(i,j);//化简分母
q=head;
while(q->next!=NULL&&p->fz*1.0/p->fm > q->next->fz*1.0/q->next->fm)//寻找插入位置
{
q=q->next;
}
if(q->next!=NULL&&p->fz*1.0/p->fm == q->next->fz*1.0/q->next->fm)//重复值跳过
{
continue;
}
p->next=q->next;//插入过程
q->next=p;//插入过程
}
}
p=head->next;
while(p!=NULL)
{
printf("%d/%d\n",p->fz,p->fm);
p=p->next;
}
}
return 0;
}
感谢ljt同学,18985!