1.题目:
把真分数表示为埃及分数之和的形式,所谓的埃及分数是指分子为1的分数
例如:7/8=1/2+1/3+1/24;要求用最少的埃及分数来表示
思路:从1/2,1/3,1/4、、、、、、、、中依次寻找,求和
2.相关代码:
#include "stdafx.h"
#include <stdio.h>
#include<stdlib.h>
typedef struct {
int fz;//分子
int fm;//分母
}FS;
int fs_gcd(int m, int n)//求两个数的最大公约数
{
int p;
while (n != 0)
{
p = m % n;
m = n;
n = p;;
}
return m;
}
void fs_jh(FS * f) //分数简化
{
int r = fs_gcd(f->fz,f->fm);//求最大公约数
f->fz = f->fz / r;
f->fm = f->fm / r;
}
FS fs_sub(FS f1, FS f2)//两个分数相减
{
FS f3;
f3.fz = f1.fz * f2.fm - f2.fz * f1.fm;
f3.fm = f1.fm*f2.fm;
fs_jh(&f3);//分数简化
return f3;
}
void main()
{
FS f1, f2;
printf("输入分子和分母:");
scanf_s("%d%d", &f1.fz, &f1.fm);
f2.fz = 1;
f2.fm = 2;//从1/2开始
printf("%d/%d=", f1.fz, f1.fm);
while (1)//这是一个死循环
{
if (f1.fz==1)//输入的就是埃及分数
{
printf("%d/%d", f1.fz, f1.fm);
break;
}
while (1.0*f1.fz/f1.fm<1.0*f2.fz/f2.fm)
{
f2.fm++;
}
printf("%d/%d+", f2.fz, f2.fm);
f1 = fs_sub(f1,f2);//两个分数相减
if (f1.fz==0)
{
break;
}
}
printf("\n");
system("pause");
}
3.运行结果: