有限连分数求解的基本思路:
设分数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;
}
注:欢迎在评论区指正。