用两个数组分别存放分子分母。
每得到一个合格的分数就插入两个数组中,并且保持数组有序
最后打印出来就好
这个的问题是不方便估算最后到底会得到多少结果,所以干脆就写了个固定的1024, N太大就会出问题了
#include"stdio.h"
int numerList[1024] = {0};
int denomList[1024] = {0};
int coprime(int bigger, int smaller)
{
if (smaller == 1) return 1;
if (smaller == 0) return 0;
return coprime(smaller, bigger%smaller);
}
void insert(int numer, int denom)
{
int i, j;
for (i=0; numerList[i]>0; ++i)
{
if (numer/(double)denom < numerList[i]/(double)denomList[i])
{
for (j=i+1; numerList[j]>0; ++j);
for (; j>i; --j)
{
numerList[j] = numerList[j-1];
denomList[j] = denomList[j-1];
}
numerList[i] = numer;
denomList[i] = denom;
return;
}
}
numerList[i] = numer;
denomList[i] = denom;
}
void main()
{
int N;
int i, j;
printf("输入N:");
scanf("%d", &N);
for (i=1; i<=N; ++i)
{
for (j=1; j
{
if (coprime(i,j)) insert(j,i);
}
}
for (i=0; numerList[i]>0; ++i)
{
printf("%d/%d\t", numerList[i], denomList[i]);
}
}
下面的程序用连分数直接按顺序打印出结果,好处是速度快,而且对N的大小几乎没有限制
#include
int N;
int p[1024] = {0};
int q[1024] = {0};
void CalcFraction(int level, int maxA)
{
int i, nextMaxA;
if (level%2 == 0) {// 偶数层,递减
p[level] = p[level-1]*maxA + p[level-2];
q[level] = q[level-1]*maxA + q[level-2];
for (i=maxA; i>1; --i)
{
printf("%d/%d\t", p[level], q[level]);
p[level] = p[level-1]*(i-1) + p[level-2];
q[level] = q[level-1]*(i-1) + q[level-2];
nextMaxA = (N-q[level-1])/q[level];
if(nextMaxA>1) CalcFraction(level+1, nextMaxA);
}
} else { // 奇数层,递增
p[level] = p[level-1] + p[level-2];
q[level] = q[level-1] + q[level-2];
for (i=2; i<=maxA; ++i)
{
nextMaxA = (N-q[level-1])/q[level];
if (nextMaxA>1) CalcFraction(level+1, nextMaxA);
p[level] = p[level-1]*i + p[level-2];
q[level] = q[level-1]*i + q[level-2];
printf("%d/%d\t", p[level], q[level]);
}
}
}
void main()
{
q[1] = 1;
p[0] = 1;
printf("输入N:");
scanf("%d", &N);
CalcFraction(2, N);
}