问题描述 :
输入一个自然数N,请写一个程序来增序输出分母小于等于N的既约真分数(即无法再进行约分的小于1的分数)
输入说明 :
单独的一行,一个自然数N(1…20)
输出说明 :
每个分数单独占一行
按照分数大小升序排列
对于分子为0的分数,仅输出0/1,不输出其它分母的分数,比如0/2, 0/3。
输入范例 :
4
输出范例 :
0/1
1/4
1/3
1/2
2/3
3/4
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef struct {
int molecule;
int denominator;
} fraction;
int reduce(int x,int y) {
int min,i;
if(x<y) {
min=x;
} else {
min=y;
}
for(i=2; i<=min; i++) {
if(x%i==0&&y%i==0) {
return 0;
}
}
return 1;
}
int main(int argc, char *argv[]) {
int n,i,j,k,tempmole,tempdeno;
while(scanf("%d",&n)!=EOF){
i=j=k=0;
fraction frac[300];
printf("0/1\n");
for(i=1; i<n; i++) {
for(j=n; j>i; j--) {
if(reduce(i,j)!=0||i==1) {
frac[k].denominator=j;
frac[k].molecule=i;
++k;
}
}
}
for(i=0; i< k-1; i++) {
for(j=0; j<k-1-i; j++) {
if((double)(frac[j].molecule)/(double)(frac[j].denominator)>(double)(frac[j+1].molecule)/(double)(frac[j+1].denominator)) {
tempmole=frac[j].molecule;
tempdeno=frac[j].denominator;
frac[j].molecule=frac[j+1].molecule;
frac[j].denominator=frac[j+1].denominator;
frac[j+1].molecule=tempmole;
frac[j+1].denominator=tempdeno;
}
}
}
for(i=0; i<k; i++) {
printf("%d/%d\n",frac[i].molecule,frac[i].denominator);
}
}
return 0;
}