M序列C语言编程,如何用c语言产生m序列

用两个数组分别存放分子分母。

每得到一个合格的分数就插入两个数组中,并且保持数组有序

最后打印出来就好

这个的问题是不方便估算最后到底会得到多少结果,所以干脆就写了个固定的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);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值