有限简单连分数求解

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
    评论
# ContinuedFraction #### 项目介绍 连分数计算器 支持连分数和小数输入,高精度小数转连分数,无精度损失,用于获取小数在一定范围内最接近的分数 例如π的高精度转连分数 str=> 3.14159265358979 num=> 3.14159265358979000000000000000000000 ctf=> [3;7,15,1,292,1,1,1,2,1,3,1,12,2,4,1,1,3,2,2,1,18,1,2,2,1,7,2,2] 1=> 3.00000000000000000000000000000000000 3 3/1 2=> 3.14285714285714285714285714285714286 7 22/7 3=> 3.14150943396226415094339622641509434 15 333/106 4=> 3.14159292035398230088495575221238938 1 355/113 5=> 3.14159265301190260407226149477372968 292 103993/33102 6=> 3.14159265392142104470871594159265392 1 104348/33215 7=> 3.14159265346743670552045478534915632 1 208341/66317 8=> 3.14159265361893662339750030141060162 1 312689/99532 9=> 3.14159265358107777120441930658185778 2 833719/265381 10=> 3.14159265359140397848254241421927966 1 1146408/364913 11=> 3.14159265358938917154368732170690821 3 4272943/1360120 12=> 3.14159265358981538324194377730744861 1 5419351/1725033 13=> 3.14159265358978910556761228975786423 12 69305155/22060516 14=> 3.14159265358979009430798477470203822 2 144029661/45846065 15=> 3.14159265358978998813773682909318658 4 645423799/205444776 16=> 3.14159265358979000750767514045607416 1 789453460/251290841 17=> 3.14159265358978999879486079142367388 1 1434877259/456735617 18=> 3.14159265358979000014512509093352444 3 5094085237/1621497692 19=> 3.14159265358978999997843356720301190 2 11623047733/3699731001 20=> 3.14159265358979000000839600248412328 2 28340180703/9020959694 21=> 3.14159265358978999999968162106153623 1 39963228436/12720690695 22=> 3.14159265358979000000001193310441815 18 747678292551/237993392204 23=> 3.14159265358978999999999517378526962 1 787641520987/250714082899 24=> 3.14159265358979000000000056801156993 2 2322961334525/739421558002 25=> 3.14159265358978999999999978607241192 2 5433564190037/1729557198903 26=> 3.14159265358979000000000002025128805 1 7756525524562/2468978756905 27=> 3.14159265358978999999999999894805542 7 59729242861971/19012408497238 28=> 3.14159265358979000000000000024695141 2 127215011248504/40493795751381 29=> 3.14159265358979000000000000000000000 2 314159265358979/100000000000000
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值