C语言将真分数分解为埃及分数代码解析

栏目: C · 发布时间: 5年前

内容简介:现输入一个真分数,请将该分数分解为埃及分数。真分数:分子比分母小的分数,叫做真分数。真分数的分数值小于1。如1/2,3/5,8/9等。分子是1的分数,叫单位分数。古代埃及人在进行分数运算时,只使用分子是1的分数。因此这种分数也叫做埃及分数,或者叫单分子分数。如:8/11=1/2+1/5+1/55+1/110。

问题描述

现输入一个真分数,请将该分数分解为埃及分数。

问题分析

真分数:分子比分母小的分数,叫做真分数。真分数的分数值小于1。如1/2,3/5,8/9等。

分子是1的分数,叫单位分数。古代埃及人在进行分数运算时,只使用分子是1的分数。因此这种分数也叫做埃及分数,或者叫单分子分数。如:8/11=1/2+1/5+1/55+1/110。

我们约定分子分母都是自然数,分数的分子用a表示,分母用b表示。

若真分数的分子b能整除分母a,则真分数经过化简就可以得到埃及分数;若真分数的分子不能整除分母,则可以从原来的分数中分解出一个分母为(b/a) +1的埃及分数。用这种方法将剩余部分反复分解,最后可得到结果。

算法设计

真分数分解为埃及分数的思路可归纳如下:

(1) 分数的分子用a表示、分母用b表示,变量c用来存储各个埃及分数的分母。

(2) 如果分母是分子的倍数,直接约简成埃及分数。

此时,埃及分数的分母c=b/a;分子为1,即直接将变量a赋值为1。

(3) 否则分数中一定包含一个分母为(b/a)+1的埃及分数。

若分母不是分子倍数,则可以分解出一个分母为(b/a)+1的埃及分数,即变量c的值 为(b/a)+1。

(4) 如果分子是1,表明已经是埃及分数,不用再分解,结束。

因为若分数的分子a为1,说明此时的分数己经是埃及分数无须再分解,可结束循环。对于这种不受循环条件限制,当某一条件满足时便可结束循环的情况,可用break语句实现。

if (a==1)

{

printf("1/%ld\n", c);

break; /*a为1标志结束*/

}

(5) 如果分子是3而且分母是偶数,直接分解成两个埃及分数1/(b/2)和1/b,结束。因分母为偶数,所以变量b—定是2的倍数,对于分解出的分数1/(b/2)经过约分之后肯定能得到一个埃及分数。原分数分解为两个埃及分数之后便可利用break语句结束循环。

if(a==3 && b%2==0)  /*若余数分子为3,分母为偶数,输出最后两个埃及分数*/

{

printf ("1/%ld + 1/%ld\n", b/2, b);

break;

}

6) 从分数中减去这个分母为(b/a)+1的埃及分数,回到步骤(2)重复上述过程。

分解出此埃及分数之后用原分数a/b减去此埃及分数,得到新的分数。此新分数的分子a=a*c-b,分母 b=b*c。

整个程序没有明确的循环条件,所以为了能使循环继续,将循环条件用一个非0的常量表示条件为真。从上述过程可以看出,虽然利用循环条件不能结束循环,当满足某一条件时利用break语句,仍然可以避免程序进入死循环。

对于某一真分数分解为一个以上的埃及分数时最后输出时要求以各分数相加的形式输出,所以在输出语句中“+”作为普通字符输出。

printf ("1/%ld + ", c);

程序流程图:

C语言将真分数分解为埃及分数代码解析

下面是完整的代码:

#include

int main()

{

long int a, b, c;

printf("请输入可选分数(a/b):");

scanf("%ld/%ld", &a, &b);  /*输入分子a和分母b*/

printf("它可以分解为:");

while(1)

{

if(b%a)  /*若分子不能整除分母,则分解出一个分母为b/a+1的埃及分数*/

c = b/a + 1;

else  /*否则,输出化简后的真分数(埃及分数)*/

{

c = b / a;

a = 1;

}

if(a==1)

{

printf("1/%ld\n", c);

break;  /*a为1标志结束*/

}

else

printf("1/%ld + ", c);

a = a * c - b;  /*求出余数的分子*/

b = b * c;  /*求出余数的分母*/

if(a==3 && b%2==0)  /*若余数分子为3,分母为偶数,输出最后两个埃及分数*/

{

printf("1/%ld + 1/%ld\n", b/2, b);

break;

}

}

return 0;

}

运行结果:

linuxidc@linuxidc:~/www.linuxidc.com$ ./linuxidc.com

请输入可选分数(a/b):9/11

它可以分解为:1/2 + 1/4 + 1/15 + 1/660

linuxidc@linuxidc:~/www.linuxidc.com$ ./linuxidc.com

请输入可选分数(a/b):3/4

它可以分解为:1/2 + 1/4

如下图:

C语言将真分数分解为埃及分数代码解析

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2019-01/156254.htm


以上所述就是小编给大家介绍的《C语言将真分数分解为埃及分数代码解析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Python语言程序设计

Python语言程序设计

[美]梁勇(Lang Y. D.) / 李娜 / 机械工业出版社 / 2015-4 / 79.00元

本书采用“问题驱动”、“基础先行”和“实例和实践相结合”的方式,讲述如何使用Python语言进行程序设计。本书首先介绍Python程序设计的基本概念,接着介绍面向对象程序设计方法,最后介绍算法与数据结构方面的内容。为了帮助学生更好地掌握相关知识,本书每章都包括以下模块:学习目标,引言,关键点,检查点,问题,本章总结,测试题,编程题,注意、提示和警告。 本书可以作为高等院校计算机及相关专业Py......一起来看看 《Python语言程序设计》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具