博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
近似与精确——《狂人C》习题解答15(第三章习题5)
阅读量:5061 次
发布时间:2019-06-12

本文共 3472 字,大约阅读时间需要 11 分钟。

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

    这是一个简单的小学算术问题:

    15头牛的一半是7又1/2 ,再加半头得8,这是妻子所得。剩下7头
    7头牛的一半是3又1/2 ,再加半头得4,这是长子所得。剩下3头
    3头牛的一半是1又1/2 ,再加半头得2,这是次子所得。剩下1头
    因而长女所得为1头。

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

#include 
#include
#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 
#include
#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

你可能感兴趣的文章
如何获取Android系统时间是24小时制还是12小时制
查看>>
fur168.com 改成5917电影
查看>>
PHP上传RAR压缩包并解压目录
查看>>
codeforces global round 1题解搬运
查看>>
python os模块
查看>>
Codeforces 719B Anatoly and Cockroaches
查看>>
jenkins常用插件汇总
查看>>
c# 泛型+反射
查看>>
第九章 前后查找
查看>>
Python学习资料
查看>>
多服务器操作利器 - Polysh
查看>>
[LeetCode] Candy
查看>>
Jmeter学习系列----3 配置元件之计数器
查看>>
jQuery 自定义函数
查看>>
jq 杂
查看>>
jquery datagrid 后台获取datatable处理成正确的json字符串
查看>>
作业一
查看>>
AJAX
查看>>
ActiveMQ与spring整合
查看>>
web服务器
查看>>