题目:从前有一个农夫,死后留下15头牛,他在遗书中写到:"妻子:分给全部牛的半数再加半头;长子:分给剩下的牛的半数再加半头;次子:分给剩下的牛的半数再加半头;长女:分给最后剩下的。"编程求长女得到了几头牛。

这是一个简单的小学算术问题:
    15头牛的一半是7又1/2 ,再加半头得8,这是妻子所得。剩下7头
    7头牛的一半是3又1/2 ,再加半头得4,这是长子所得。剩下3头
    3头牛的一半是1又1/2 ,再加半头得2,这是次子所得。剩下1头
    因而长女所得为1头。

但是如果写出如下的代码,则最多只能得60分。

#include <stdio.h>
#include <stdlib.h>#define ZONGSHU     15.  //总数:留下15头牛
#define FENPEI_BL   .5   //分配比例: 半数
#define EWAI_TJ     .5   //额外添加:半头 int main( void )
{double qizi , zhangzi , cizi , zhangnv  ; //妻子、长子、次子、长女所得 double shengyu = ZONGSHU                ; //剩余的数量 qizi =  shengyu * FENPEI_BL +  EWAI_TJ ;     //妻子所得shengyu -= qizi ;                            //剩余的数量zhangzi =  shengyu * FENPEI_BL +  EWAI_TJ ;  //长子所得shengyu -= zhangzi ;                         //剩余的数量cizi =  shengyu * FENPEI_BL +  EWAI_TJ ;     //次子所得shengyu -= cizi ;                            //剩余的数量zhangnv =  shengyu ;                         //长女:分给最后剩下的printf("长女得到了%f头牛\n" , zhangnv ) ;system("PAUSE"); return 0;}

输出:长女得到了1.000000头牛

因为,第一,这个结果仅仅表示长女得到的牛数约等于1头;第二,代码并没有真正实现前面的算术运算过程。譬如
    qizi =  shengyu * FENPEI_BL +  EWAI_TJ ;
    所表示的含义仅仅是一些近似的值的一个近似运算,而非前面算术运算过程中的精确运算。因为就其本质和普遍情形来讲,实浮点类型的数据只是对实数的一个近似表示,这注定实浮点类型的运算也只是一种近似运算。只不过在本题目中,近似的精度很高,计算结果恰好和精确的结果一致而已。如果把程序视为对笔算过程的精确模拟的话,显然前面一段代码并不符合要求。
    在计算机中,只有整数类型是对整数集合子集的近似表示。所以如果希望准确地模拟笔算过程就只能用整数类型。然而笔算过程涉及到了分数。在数学中,分数也是一种精确表示,然而在C语言中却并没有与之对应的“分数类型”。
    没有相应的数据类型怎么办?答案很简单:没有这种类型就创造这种数据类型。为创造性提供了广阔的发挥空间是C语言的特点和魅力,也恰恰是编程的乐趣之一。
    由于分数是由分子、分母两个部分组成,而分子、分母都是整数,因而可以用两个整数类型的数据来表示分数。对于这样的数据,C语言并没有提供直接的运算,这种“分数”的运算需要自己用C语言所提供的运算模拟。
    例如,若计算a/b+c/d,则无法通过一次“+”运算完成,只能分两次计算出和的分子“b*c+d*c”及和的分母“a*c”。
    按照这种办法得到的代码是

#include <stdio.h>
#include <stdlib.h>#define ZONGSHU_FZ     15  //总数的分子
#define ZONGSHU_FM     1   //总数的分母
#define FENPEI_BL_FZ   1   //分配比例的分子
#define FENPEI_BL_FM   2   //分配比例的分母
#define EWAI_TJ_FZ     1   //额外添加的分子
#define EWAI_TJ_FM     2   //额外添加的分母 int main( void )
{int  qizi_fm    , qizi_fz    , //妻子所得的分母和分子 zhangzi_fm , zhangzi_fz , //长子所得的分母和分子cizi_fm    , cizi_fz    , //次子所得的分母和分子  zhangnv_fm , zhangnv_fz ; //长女所得的分母和分子 int  shengyu_fm = ZONGSHU_FM , //剩余的数量的分母shengyu_fz = ZONGSHU_FZ ; //剩余的数量的分子 qizi_fz  =  shengyu_fz * EWAI_TJ_FM                        //妻子所得+  shengyu_fm * FENPEI_BL_FM * FENPEI_BL_FZ; qizi_fm  =  shengyu_fm * FENPEI_BL_FM * EWAI_TJ_FM ;      shengyu_fz =  shengyu_fz * qizi_fm - qizi_fz * shengyu_fm ; //剩余的数量shengyu_fm *= qizi_fm ;                       zhangzi_fz  =  shengyu_fz * EWAI_TJ_FM                        //长子所得+  shengyu_fm * FENPEI_BL_FM * FENPEI_BL_FZ; zhangzi_fm  =  shengyu_fm * FENPEI_BL_FM * EWAI_TJ_FM ;      shengyu_fz =  shengyu_fz * zhangzi_fm - zhangzi_fz * shengyu_fm ; //剩余的数量shengyu_fm *= zhangzi_fm ;                       cizi_fz  =  shengyu_fz * EWAI_TJ_FM                        //次子所得+  shengyu_fm * FENPEI_BL_FM * FENPEI_BL_FZ; cizi_fm  =  shengyu_fm * FENPEI_BL_FM * EWAI_TJ_FM ;      shengyu_fz =  shengyu_fz * cizi_fm - cizi_fz * shengyu_fm ; //剩余的数量shengyu_fm *= cizi_fm ;            zhangnv_fz =  shengyu_fz ;                                   //长女所得zhangnv_fm =  shengyu_fm ;printf("长女得到了%d又%d/%d头牛\n" , shengyu_fz/shengyu_fm , shengyu_fz % shengyu_fm , shengyu_fm ) ;system("PAUSE"); return 0;}

输出:长女得到了1又0/16384头牛

这是一个精确的结果。
    【注:学习了控制语句和函数理论之后,后一个代码可以进一步改进。】

转载于:https://www.cnblogs.com/KBTiller/archive/2011/09/24/2189685.html

近似与精确——《狂人C》习题解答15(第三章习题5)相关推荐

  1. 走台阶 OR 台阶走——《狂人C》习题解答14(第三章习题4)

    题目: 4. 有一段楼梯有6级台阶,规定每一步只能跨一级或两级,要登上第6级台阶有几种不同的走法? 这个题目从数学角度来看可能有一点难度,但一经点破也就没什么难度了.      首先第1级台阶只有一种 ...

  2. 怎样写C代码——《狂人C》习题解答1(第一章习题7)

    自打小学开始,人们就被告知,做题之前应该先审题.这道理虽然很浅显,但却无比重要.     然而正是由于这道理过于浅显,所以总免不了被轻视--甚至被遗忘.人类历史上发生过无数次因为轻视简单浅显的道理而招 ...

  3. 设某微型计算机内存ram区,微机原理第三章习题.doc

    微机原理第三章习题 第四章 指令与寻址方式习题解答 1.试分别说明下列各指令中源操作数和目的操作数使用的寻址方式: (1) AND AX,0FFH (2) AND BL,[OFFH] (3) MOV ...

  4. 琼斯是计算体心立方弹性模量_固体物体第三章习题

    固体物体第三章习题 第三章 晶体结合 3.1 惰性气体晶体 惰性气体晶体是最简单的分子晶体,原子间的相互作用能可以用勒纳-琼斯势描写 式中r是原子间的距离,A.B是两个常数.第一项代表吸引作用,第二项 ...

  5. 计算机组成原理译码器选择,计算机组成原理第三章习题参考解析.doc

    计算机组成原理第三章习题参考解析 第3章习题参考答案 1.设有一个具有20位地址和32位字长的存储器,问 (1) 该存储器能存储多少字节的信息? (2) 如果存储器由512K×8位SRAM芯片组成,需 ...

  6. 随机过程及其在金融领域中的应用 第三章 习题 及 答案

    随机过程及其在金融领域中的应用 第三章 习题 及 答案 本文地址: http://blog.csdn.net/caroline_wendy/article/details/16879515 包含: 1 ...

  7. 第三章 计算机网络技术,计算机网络技术第三章习题

    计算机网络技术第三章习题 1.网络协议是指网络数据交换而制定的规责.约定与标准的集合,它由______._______.________三部分组成 2.计算机网络采用_______的体系结构,网络中两 ...

  8. 算法竞赛入门经典(第二版)第三章习题

    声明:作者水平有限,只是会基础C语言的小菜,C++还未入门.作者仅根据算法竞赛入门经典(第二版)书上第三章习题所述题意而编写,并未严格按照原题的输入输出编写,代码仅经过个人测试(OJ网站太慢了).代码 ...

  9. python第三章课后答案_XX医学院本科各专业《Python》第三章习题与答案-2020年实用精品...

    XX医学院本科各专业<Python>第三章习题与答案 一.填空题 1.python语言提供.和3种数字类型.(整数.浮点数.复数) 2.整数类型有4种进制表示,默认情况采用十进制,二进制数 ...

最新文章

  1. flume自定义Interceptor
  2. Asp.net 序列化应用实例(转载)
  3. BZOJ3534:[SDOI2014]重建(矩阵树定理)
  4. Java 文件及文件夹复制
  5. NetBeans 7 Python 又回来了
  6. 52单片机iic读写c语言,如何52单片机的I2C读写24C08程序问题排查修改
  7. VxWorks动态加载
  8. vue ---- webpack扩展
  9. 在移动设备中创建ArcGIS API for JavaScript地图应用程序
  10. SCI论文下载之chrome插件
  11. Redis数据类型及编码
  12. 《这样思考,人生就不一样》/《思考的整理学》 博客思听 2010年1月
  13. ADB使用及日志分析
  14. python中转义是什么意思_python中的转义
  15. linux命令行 随机排列,有趣的Linux命令行:随机输出唐诗宋词
  16. 自动颁发证书 AD域策略
  17. 论文阅读”NCAGC: A Neighborhood Contrast Framework forAttributed Graph Clustering“(arxiv)
  18. 速写为什么要把人画丑?骨骼肌肉比画的更像加分
  19. Vue项目开发中优雅的切换服务端ip
  20. Linux任务之自动发邮件

热门文章

  1. linux 系统监控、诊断工具之 top 详解
  2. ASCII码对应表chr(9)、chr(10)、chr(13)、chr(32)、chr(34)、chr(39)、chr(..
  3. 使用shell脚本监控共享池内存碎片
  4. P3272 [SCOI2011]地板(插头DP)
  5. thinkphp的使用——隐藏index.php
  6. 网页侧边浮动条的实现
  7. [转]编程语言中的 鸭子模型(duck typing)
  8. 总结XX餐饮收银项目中的得与失
  9. 三层开发中容易犯的错误
  10. 安卓开发要学多久_华为发布鸿蒙2.0,和安卓相似度达80%「西瓜视频」