88 顺序的分数
作者: xxx时间限制: 1S章节: 结构体
问题描述 :
输入一个自然数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<memory.h>
struct num{
int zi;
int mu;
};
int fun(int n,int m){
int i,temp;
if(n>m){
temp=n;
n=m;
m=temp;
}
if((n==1||n==0)&&m>1){
return 1;
}
for(i=2;i<=n;i++){
if(n%i==0&&m%i==0){
return 0;
}
}
return 1;
}
//选择排序
void sort(struct num a[],int len){
double x,y;
int tempFenzi,tempFenMu,min,i;
for(i=0;i<len-1;i++){
x=(double)(a[i].zi)/(double)(a[i].mu);
min=i;
for(int j=i+1;j<len;j++){
y=(double)a[j].zi/a[j].mu;
if(x>y){
min=j;
x=y;
}
}
if(min!=i){
tempFenzi=a[min].zi;
tempFenMu=a[min].mu;
a[min].zi=a[i].zi;
a[min].mu=a[i].mu;
a[i].zi=tempFenzi;
a[i].mu=tempFenMu;
}
}
}
int main(){
int n,i,j,len;
struct num a[100];
while(scanf("%d",&n)!=EOF){
memset(a,0,sizeof(struct num)*100);
len=0;
if(n>1){
a[len].zi=0;
a[len].mu=1;
len++;
}
for(i=1;i<n;i++){
for(j=n;j>i;j--){
if(fun(i,j)){
a[len].zi=i;
a[len].mu=j;
len++;
}
}
}
sort(a,len);
for(i=0;i<len;i++){
printf("%d/%d\n",a[i].zi,a[i].mu);
}
}
return 0;
}