有限简单连分数求解

3 篇文章 0 订阅

有限连分数求解的基本思路:
设分数fn,整数部分z,非整数部分r,[x]表示不超过x的最大整数。
(0)令z0=[fn],r0=fn-z,0<= r< z。
(1)若r0=0,则终止。否则,令z1=[1/r0],r1=1/r0-z1。
(2)若r1=0,则终止。否则,令z2=[1/r1],r2=1/r1-z2。
(3)如此循环下去,直至rn=0。

下面是实现代码(只支持分数形式的连分数求解):

#include<stdio.h>

typedef struct {
	int numer;//分子
	int denom;//分母
}fraction;//分数

//取整函数,返回整数部分
int Integer(fraction f)
{
	int n = f.numer / f.denom;
	if (n >= 0)
		return int(n);
	else
		return int(n) - 1;
}

//取非整数部分,返回非整数部分
fraction Remind(fraction f)
{
	int z = Integer(f);
	f.numer = f.numer - z*f.denom;
	return f;
}

//连分数求解,返回数组大小
int Solve(fraction f, char* a)
{
	int z = Integer(f);
	a[0] = z + '0';
	int index = 0;
	fraction r = Remind(f);
	while (r.numer > 0) {//分子不等于0
		//分数的倒数
		int temp = r.numer;
		r.numer = r.denom;
		r.denom = temp;

		z = Integer(r);
		a[++index] = z + '0';
		r = Remind(r);
	}
	return index + 1;
}

int  main()
{
	fraction fn;
	char a[10000];//字符串存储连分数
	printf("请输入分子和分母,中间用空格隔开\n");
	while (1){
		scanf("%d%d", &fn.numer, &fn.denom);
		int len = Solve(fn, a);
		printf("连分数为:[ "); 
		for (int i = 0; i < len - 1; ++i){
			printf("%d,", a[i] - '0');
			if(i % 5 == 4)
				printf(" ");
		}	
		printf("%d ]\n", a[len - 1] - '0');
	}
	return 0;
}

注:欢迎在评论区指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值