C语言编程问题,请高手指导

来源:百度知道 编辑:UC知道 时间:2024/06/25 06:33:58
题意描述:将所有的分母小于N的真分数(分子小于分母,数值小于1)从大到小排列出来后,例如当N=4时,所有的真分数有1/4,1/3,1/2,2/3,3/4。其中第三个真分数为1/2,其分子为1,分母为2。编一个程序,对给定的N,求出第M个真分数的值。

Input

输入文件中第一行有一个数N,第二行为一个数字M(N <=10^5,M<=10^9)。

Output

输出文件中有两行,第一行为分子K1,第二行为分母K2。其中K1 和K2没有除1以外的公约数。

Sample Input

4
3

Sample Output

1
2

这题10分实在是少了点,不过为了锤炼一下自己的思维,还是写了。
本题的一个完整的c程序如下,程序在win-tc和Dev-c++下都调试通过。
#include<stdio.h>
#include<stdlib.h>

int main()
{ FILE *fp1,*fp2;
int i,j,s=0,num,n,m[255][2];
int temp,temp1,temp2;
if((fp1=fopen("input.txt","r"))==NULL)
{ printf("file input.txt cannot be opened!\n");
system("pause");
exit(0);
}
fp2=fopen("output.txt","w");
fscanf(fp1,"%d",&num);
fscanf(fp1,"%d",&n);
for(i=1;i<num;i++)
for(j=num;j>i;j--)
{ temp1=i;
temp2=j;
while(temp1!=0)
{ temp=temp2%temp1;
temp2=temp1;
temp1=temp;
}
if(temp2==1)
{ m[s][0]=i;
m[s][1]=j;
s++;
}
}
for(i=0;i<s-1;i++)/* 冒泡排序 */
for(j=i+1;j<s-i;j++)/* 将所有找出的真分数按从小到大排序 */
if((double)m[j][0]/(double)m[j][1]<(double)m[j-1][0]/(double)m[j-1][