求以下程序·--分数排序!!急·!急·!急·!!!!!

lixianye22222 2009-05-30 07:08:48
分数排序

考虑在0和1之间的所有分母不大于N的最简分数,下面是N=5时的情况: 0/1, 1/5, 1/4 ,1/3 ,2/5 ,1/2 ,3/5, 2/3, 3/4 ,4/5, 1/1 .总共有11个分数。写出一个程序对于给定的整数N(1<=N<=100),按从小到大的顺序打印出这些分数。还要打印出它们的总数。在每个分数后面打印出3个空格,使它们在显示的时候一行不会很长。
要求:当N<1或N>100时,程序应判错。
运行举例:
Please input the N?
5
0/1 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 1/1
There were 11 fractions.






明天要交作业·!!!
有意者速来帮忙·!!!!!!!!!!!!!
...全文
316 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
caaaaab 2011-06-01
  • 打赏
  • 举报
回复
回复可见内容需要回复才可见
hjjdebug 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liao05050075 的回复:]
这个序列叫法雷序列。

Farey Sequence 的构造
法雷数列的构造可采用2分法,即如果 a/b, c/d (a/b <c/d)是一个n级法雷数列中的两个元素,且b+d <=n,  则可以在a/b, c/d 中间插入一个分数 (a+b)/(c+d)。下面以5级法雷数列为例,给出详细的过程。

step1: 准备两个数 0/1, 1/1 作为整个法雷数列的第一个元素和最后一个元素
0/1, 1/1
step2: 在两个数中间插入1个数1/2, 变为
0/1, 1/2, 1/1
step3: 在每对相邻两个数中间…
[/Quote]
顶! 数列构造法。 两值之间插入一个值
qq452551918 2009-05-31
  • 打赏
  • 举报
回复
顶一个 学习
sun90cn 2009-05-31
  • 打赏
  • 举报
回复
顶你个肺,哈哈。
wanghao111 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liao05050075 的回复:]
这个序列叫法雷序列。

Farey Sequence 的构造
法雷数列的构造可采用2分法,即如果 a/b, c/d (a/b <c/d)是一个n级法雷数列中的两个元素,且b+d <=n, 则可以在a/b, c/d 中间插入一个分数 (a+b)/(c+d)。下面以5级法雷数列为例,给出详细的过程。

step1: 准备两个数 0/1, 1/1 作为整个法雷数列的第一个元素和最后一个元素
  0/1, 1/1
step2: 在两个数中间插入1个数1/2, 变为
  0/1, 1/2, 1/1
step3: 在每对…
[/Quote]
o0MyBelieve0o 2009-05-31
  • 打赏
  • 举报
回复
用for 就可以了
xuguod20042576 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liao05050075 的回复:]
这个序列叫法雷序列。

Farey Sequence 的构造
法雷数列的构造可采用2分法,即如果 a/b, c/d (a/b <c/d)是一个n级法雷数列中的两个元素,且b+d <=n, 则可以在a/b, c/d 中间插入一个分数 (a+b)/(c+d)。下面以5级法雷数列为例,给出详细的过程。

step1: 准备两个数 0/1, 1/1 作为整个法雷数列的第一个元素和最后一个元素
  0/1, 1/1
step2: 在两个数中间插入1个数1/2, 变为
  0/1, 1/2, 1/1
step3: 在每对…
[/Quote]


xuguod20042576 2009-05-31
  • 打赏
  • 举报
回复
up
陽洸膂珵 2009-05-31
  • 打赏
  • 举报
回复
顶!
victor8200 2009-05-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kingstarer 的回复:]
不建议直接拿作业上来问

这样对自己成长不利

除非你无心在此行工作
[/Quote]
呵呵~~~UP
chyjp2008 2009-05-30
  • 打赏
  • 举报
回复

菜鸟版,呵呵
#include <stdio.h>
int main()
{
int n,result[10000][2],count=0,i,j,a,b,t;
printf("Please input the N? \n");
scanf("%d",&n);
if(n<1 || n>100)
{
printf("input err!\n");
return 0;
}

for(i=1;i<=n-1;i++) //求出所有非0、1的最简可能组合(含相等值)
for(j=i+1;j<=n;j++)
{
a=j;
b=i;
while(b!=0)
{
t=a%b;
a=b;
b=t;
}
result[count][0]=i/a;
result[count][1]=j/a;
count++;
}
for(i=0;i<count-1;i++) //非递减排序
for(j=i+1;j<count;j++)
{
if((double)result[i][0]/result[i][1]>(double)result[j][0]/result[j][1])
{
a=result[i][0];
result[i][0]=result[j][0];
result[j][0]=a;
a=result[i][1];
result[i][1]=result[j][1];
result[j][1]=a;
}
}

for(i=0;i<count-1;i++) //去除重复值
{
if((double)result[i][0]/result[i][1]==(double)result[i+1][0]/result[i+1][1])
{
for(j=i;j<count-1;j++)
{
result[j][0]=result[j+1][0];
result[j][1]=result[j+1][1];
}
i--;
count--;

}
}


printf("0/1 "); //输出
for(i=0;i<count;i++)
printf("%d/%d ",result[i][0],result[i][1]);
printf("1/1\n");
printf("There were %d fractions.\n",count+2);
return 0;
}

kingstarer 2009-05-30
  • 打赏
  • 举报
回复
不建议直接拿作业上来问

这样对自己成长不利

除非你无心在此行工作
  • 打赏
  • 举报
回复
..作业题,顶
lylm 2009-05-30
  • 打赏
  • 举报
回复
刚才写的那个没有加排序,下面的加上,在不知道法雷序列时,这个不失为一个解法:

#include <stdio.h>

int pos[1024];

//判断是否互质
int huzhi(int m,int n)
{
int big = (m>n)?m:n;
int small = m+n-big;
int tmp;

while(small>1)
{
tmp = small;
if((small=big%small) == 0)
return 0;
big = tmp;
}
return 1;
}

void bubble_sort(double *p,int num)
{
int i,j;
int tmp;
for(i=0;i<num-1;i++)
for(j=i+1;j<num;j++)
{
if(p[i]>p[j])
{
//对分数排序
double a;
a = p[i];
p[i] = p[j];
p[j] = a;
//对数组下标排序
tmp = pos[i];
pos[i] = pos[j];
pos[j] = tmp;
}
}
}

void main()
{
int n,i,j,cnt=0;
int parent[1024],child[1024];
double fra[1024];

printf("please input N:");
scanf("%d",&n);
if(n<1 || n>100)
{
printf("input err!\n");
return;
}
parent[cnt] = 1;
child[cnt] = 0;
fra[cnt] = 0;
cnt++;
parent[cnt] = 1;
child[cnt] = 1;
fra[cnt] = 1;
cnt++;
//罗列每个分数
for(i=2;i<=n;i++)
{
for(j=1;j<i;j++)
{
if(huzhi(i,j) == 1)
{
parent[cnt] = i;
child[cnt] = j;
fra[cnt] = j/(double)i;
cnt++;
}
}
}

//初始化数组下标
for(i=0;i<cnt;i++)
{
pos[i]=i;
}
//排序
bubble_sort(fra,cnt);

for(i=0;i<cnt;i++)
{
printf("%d/%d ",child[pos[i]],parent[pos[i]]);
if(i%3 == 2)
printf("\n");
}
}
djh512 2009-05-30
  • 打赏
  • 举报
回复
帮顶
lylm 2009-05-30
  • 打赏
  • 举报
回复
自己写了个
#include <stdio.h>

//判断是否互质
int huzhi(int m,int n)
{
int big = (m>n)?m:n;
int small = m+n-big;
int tmp;

while(small>1)
{
tmp = small;
if((small=big%small) == 0)
return 0;
big = tmp;
}
return 1;
}

void main()
{
int n,i,j,cnt=0;
int parent[1024],child[1024];
double fra[1024];

printf("please input N:");
scanf("%d",&n);
if(n<1 || n>100)
{
printf("input err!\n");
return;
}
parent[cnt] = 1;
child[cnt] = 0;
cnt++;
parent[cnt] = 1;
child[cnt] = 1;
cnt++;
//罗列每个分数
for(i=2;i<=n;i++)
{
for(j=1;j<i;j++)
{
if(huzhi(i,j) == 1)
{
parent[cnt] = i;
child[cnt] = j;
cnt++;
}
}
}
for(i=0;i<cnt;i++)
{
printf("%d/%d ",child[i],parent[i]);
if(i%3 == 2)
printf("\n");
}
}
mengjfu 2009-05-30
  • 打赏
  • 举报
回复
顶楼上,高人!!!
liao05050075 2009-05-30
  • 打赏
  • 举报
回复
这个序列叫法雷序列。

Farey Sequence 的构造
法雷数列的构造可采用2分法,即如果 a/b, c/d (a/b<c/d)是一个n级法雷数列中的两个元素,且b+d<=n, 则可以在a/b, c/d 中间插入一个分数 (a+b)/(c+d)。下面以5级法雷数列为例,给出详细的过程。

step1: 准备两个数 0/1, 1/1 作为整个法雷数列的第一个元素和最后一个元素
  0/1, 1/1
step2: 在两个数中间插入1个数1/2, 变为
  0/1, 1/2, 1/1
step3: 在每对相邻两个数中间插入1个数,变为
  0/1, 1/3, 1/2, 2/3, 1/1
step4: 在每对相邻两个数中间插入1个数,变为
  0/1, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 1/1
step5: 0/1 和 1/4 之间 和3/4和 1/1 仍然可插入1个数,使得插入的数分母不大于5
  0/1, 1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5, 1/1
至此,该序列包含了所有分母不大于5的最简真分数,且各个分数以递增顺序排列。


下面是我写的C程序:

#include<stdio.h>

struct node
{
int a,b;
}ans[10000],a,b;

int len;
int n;
void make_sequence(struct node a, struct node b)
{
struct node tmp;
if(a.b + b.b > n) return;
tmp.a=a.a + b.a;
tmp.b=a.b + b.b;
make_sequence(a, tmp);
ans[len++]=tmp;
make_sequence(tmp, b);
}

int main()
{
int i;
puts("Please input the N?");
scanf("%d",&n);
if(n<1||n>100)
{
puts("Invalidate input!");
return 0;
}
a.a=0,a.b=1;
b.a=1,b.b=1;
len=1;
ans[0]=a;
make_sequence(a, b);
ans[len++]=b;
for(i = 0; i< len; i++)
printf("%d/%d ",ans[i].a, ans[i].b);
printf("\nThere were %d fractions.\n",len);
return 0;
}
光宇广贞 2009-05-30
  • 打赏
  • 举报
回复
顶一个!
liliangbao 2009-05-30
  • 打赏
  • 举报
回复
帮顶~
加载更多回复(2)

69,393

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧