[工学]6 模拟与高精度计算.ppt

  1. 1、本文档共62页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]6 模拟与高精度计算

现实中的有些问题难以找到公式或规律来解决。只能按照一定步骤不停地做下去,最后才能得到答案。这样的问题,用计算机来解决十分合适,只要能让计算机模拟人在解决问题时的行为即可。这一类的问题可以称之为“模拟题”。 摘花生 /problem?id=2950 问题描述 鲁宾逊先生有一只宠物猴,名叫多多。这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”。 鲁宾逊先生和多多都很开心,因为花生正是他们的最爱。在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格(如图1)。 例如在图2所示的花生田里,只有位于(2, 5), (3, 7), (4, 2), (5, 4)的植株下长有花生,个数分别为13, 7, 15, 9。沿着图示的路线,多多在21个单位时间内,最多可以采到37个花生。 输入格式 输入的第一行包括一个整数T,表示数据组数。 每组输入的第一行包括三个整数,M, N和K,用空格隔开;表示花生田的大小为M * N(1 = M, N = 50),多多采花生的限定时间为K(0 = K = 1000)个单位时间。接下来的M行,每行包括N个非负整数,也用空格隔开;第i + 1行的第j个整数Pij(0 = Pij = 500)表示花生田里植株(i, j)下花生的数目,0表示该植株下没有花生。 输出要求 输出包括T行,每一行只包含一个整数,即在限定时间内,多多最多可以采到花生的个数。 样例输入 6 7 21 0 0 0 0 0 0 0 0 0 0 0 13 0 0 0 0 0 0 0 0 7 0 15 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 样例输出 37 解题思路 参考程序 显示器 3、解题思路 解题思路 解题思路 4、参考程序 4、参考程序 4、参考程序 4、参考程序 5、实现技巧 模拟类课外练习 CDOJ:1040猴子选大王、1078约瑟夫斯问题、1073 UESTC冠军杯 什么是高精度计算? C/C++中的int 类型能表示的范围是-231 -- 231–1。unsigned 类型能表示的范围是 0 -- 232–1,即 0 -- 4294967295。所以,int 和unsigned 类型变量,都不能保存超过10 位的整数。(另外,long long类型也不能保存超过20位的整数,因为264 = 18,446,744,073,709,551,616) 有时需要参与运算的数值,可能会远远不止10、20位,例如,可能需要保留小数点后面100位(比如求π的值),那么,即便使用能表示的很大数值范围的double变量,但是由于double变量只有64 位,所以还是不可能达到精确到小数点后面100位这样的精度。long long变量的精度也不足以表示一个100 位的整数。一般我们称这种基本数据类型无法表示的整数为大整数。如何表示和存放大整数呢?基本的思想就是:用数组存放和表示大整数。一个数组元素,存放大整数中的一位。 那么,如何解决类似大整数这样的高精度计算问题呢? 高精度数的一种实现办法 高精度数事实上就是一个整型数组,根据题目中用的数据的位数设定数组的大小。为了方便通常将高精度数创建为一个新类型,如:int a[250]; a[0]将存储高精度数的位数,而从 a[1]到 a[a[0]]分别从低位到高位存储高精度数的每一位 数(这样每当一位超过 9时,会向前一进位的高精度数,为十进制高精度数)。未使用的部分均为 0。 例如将 123456789012存入 a 中为 当 a[i]上的数据大于等于 10的时候,就要向高位进位了。因为该数组中下标越大,位数越高,故对a[i] 位进行进位的操作为: a[i + 1] = a[i] / 10; a[i] %= 10; 如果 a[a[0]]位也大于等于 10,在进位的同时就要考虑a[0]的值的改变了。处理方式是先估计a[0]能改变的最大值,再依次减小,直到达到准确位数。 l = a[0] + MAX; while (a[l] == 0 l 1) l--; a[0] = l; 当 a[i]上的数据小于 0 的时候,就要由高位退位了。因为该数组中下标越大,位数越高,故当 a[i]位小于 0时,a[i + 1]位退位的操作 (以十进制为例)为: a[i + 1]--; a[i]

文档评论(0)

qiwqpu54 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档