2013软专高级程序语言T4(最大公约数gys)

给定一个正整数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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值