版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、常用算法与程序设计,1,第 7 章,模 拟,常用算法与程序设计,2,主要内容,常用算法与程序设计,3,7.1 模拟概述,应用计算机程序设计模拟自然界的随机现象,模拟特定条件下的操作过程,是程序设计难以把握且颇具魅力的课题之一。 根据模拟对象的不同特点,计算机模拟可分为决定性模拟与随机性模拟。 决定性模拟是对决定性过程进行的模拟,其模拟的事件 按其固有的规律发生发展。 例如运算模拟就是决定性模拟。 随机性模拟的对象是随机事件,利用随机数作为参数实施模拟。 例如数字模拟(又称数字仿真)。,常用算法与程序设计,4,运算模拟是按整数的四则运算法则进行模拟操作,最后得出模拟运算的结果。 7.2.1 运算
2、模拟描述 运算模拟,主要是模拟整数逐位乘除的运算过程,求解一些整数计算问题。 在实施乘除运算模拟之前,必须根据参与运算整数的实际设置模拟量,以模拟乘除运算进程中数值的变化,并判定运算是否结束。,7.2 运算模拟,常用算法与程序设计,5,1. 模拟除法运算,除运算模拟框架描述: 输入 确定 while() a=c*10+m; /* 构造被除数a,m为 */ b=a/p; /* 实施除运算,计算商b */ printf(b); c=a%p; /* 试商得余数c */ 其中,与必须根据模拟除运算问题的具体实际确定。,常用算法与程序设计,6,乘运算模拟框架描述: 输入 确定 while() k=k+1
3、; a=w(k)*p+m; /* 计算乘积a,m为 */ w(k)=a%10; /* 积a的个位存储到w(k) */ m=a/10; /* 积a的十位以上作为进位数 */ 输出(w(d),w(d-1),w(1); /* 高位到低位输出 */ 乘运算模拟的,与根据模拟乘运算问题的实际确定。,2. 模拟乘法运算,常用算法与程序设计,7,1. n个1被2009整除问题 【例7.1】 一个由n个1组成的整数能被2009整除,n至少为多大? 模拟除运算设计 : 被除数为a, 除数p=2009,每次试商的余数为c。 被除数a=c*10+1,每次试商所得余数为c=a%2009。 设置初始值c=1111,n=
4、4,进入模拟整除循环。 循环条件为c0。每循环一次,变量n增1。 若余数c=0,结束,输出n的值。,7.2.2 n个1的整除问题,常用算法与程序设计,8,void main() int a,c,n; c=1111;n=4; /* 确定初始值 */ while(c!=0) a=c*10+1; /* 构造被除数a */ c=a%2009; n+; /* 实施除运算,得余数c */ printf(至少%d个1.n,n); ,常用算法与程序设计,9,2. 积为n个1的数字游戏 【例7.2】 两位计算机爱好者在进行“积为n个1的数字游戏”:其中一位给定一个正整数p(约定整数p为个位数字不是5的奇数),另
5、一位寻求正整数q,使得p与q之积为全是1组成的整数. 模拟除运算设计: 设整数除运算每次试商的被除数为a, 除数为p(即给定的正整数),每次试商的商为b,相除的余数为c。 被除数a=c*10+1,余数c=a%p,商b=a/p即为所寻求数q的一位。若余数c=0,结束;否则,继续运算直到c=0为止。,常用算法与程序设计,10,void main() int a,b,c,p,n; printf(n请输入整数p:); scanf(%d, ,常用算法与程序设计,11,7.2.3 尾数前移问题,【例7.3】 整数n的尾数是9,把尾数9移到其前面(成为最高位)后所得的数为原整数n的3倍,原整数n至少为多大?
6、 这是数学通报上发表的一个具体的尾数前移问题。我们要求解一般的尾数前移问题: 整数n的尾数q(限为一位)移到n的前面所得的数为n的p倍,记为n(q,p)。这里约定。 对于指定的尾数q与倍数p,求解n(q,p)。 下面试用模拟除运算与模拟乘运算两种方法设计求解。,常用算法与程序设计,12,1. 模拟整数除法,首先第一位数q除以p(注意约定qp),余数为c,商为b。输出数字b作为所求n的首位数。 进入模拟循环,当余数c=0且商b=q时结束,因而循环条件为c!=0 | b!=q。 在循环中计算被除数a=c*10+b,试商得b=a/p, 输出作为所求n的一位b;求得余数c=a%p;然后b与c构建下一轮
7、试商的被除数,依此递推。,常用算法与程序设计,13,void main() int a,b,c,p,q; scanf(%d,%d, ,常用算法与程序设计,14,设置存储数n的w数组。 从w(1)=q开始,乘数p与n的每一位数字w(i)相乘后加进位数m ,得a=w(k)*p+m; 积a的十位以上的数作为下一轮的进位数 m=a/10; 而a的个位数此时需赋值给乘积的下一位w(i+1)=x%10。 当计算的被除数a为尾数q时结束。,2. 模拟整数乘法,常用算法与程序设计,15,void main() int a,m,j,k,p,q,w100; scanf(%d,%d, ,常用算法与程序设计,16,7
8、.2.5 求圆周率,关于圆周率的计算,历史非常久远。我国数学家祖冲之最先把圆周率计算到3.1415926,领先世界一千多年。尔后; 德国数学家鲁特尔夫把计算到小数点后35位; 日本数学家建部贤弘计算到41位。 1874年英国数学家香克斯利用微积分倾毕生精力把计算到707位,但528位后的数值是错的。,常用算法与程序设计,17,常用算法与程序设计,18,常用算法与程序设计,19,(3) 模拟乘除综合运算 设置a数组, 计算的整数值存放在a(0),小数点后第i位存放在a(i)中(i=1,2,.)。 依据公式(7.1),应用模拟乘除运算进行计算: 数组赋初值a(0)=1后: 除以2n+1,乘以n,加
9、上1; 再除以2n-1,乘以n-1,加上1;.这些数组操作设置在循环中实施。,常用算法与程序设计,20,模拟乘除运算描述: for(c=1,j=n;j=1;j-) /* 按公式分步计算n次 */ d=2*j+1; for(i=0;i=0;i-) /* 各位实施乘j */ a(i)=a(i)*j+b; b=a(i)/10;a(i)=a(i)%10; a(0)=a(0)+1;c=a(0); /* 整数位加1 */ for(b=0,i=x+5;i=0;i-) /* 按公式各位乘2 */ a(i)=a(i)*2+b; b=a(i)/10;a(i)=a(i)%10; ,常用算法与程序设计,21,(4)
10、输出结果 循环实施除乘操作完成后,按数组元素从高位到低位顺序输出。因计算位数较多,为方便查对,每一行控制打印50位,每10位空一格。 (5) 复杂度分析 以上模拟乘除运算算法的时间复杂度O(nlogn),其中n为所需计算的位数,logn约为所需计算的项数。,常用算法与程序设计,22,7.3.3 模拟发扑克牌 【例7.8】 模拟扑克升级发牌,把含有大小王的共54张牌随机分发给4家,每家12张,底牌保留6张。 (1) 模拟花色与点数 模拟发牌必须注意随机性,不可重复性。 对应四种花色, 设置随机整数x,对应取值为1-4。 对应每种花色的13点,设置随机整数y,对应取值为1-13。 为避免重复,把x
11、与y组合为三位数:z=x*100+y,并存放在数组m(54)中。 为发第i+1张牌,产生数z与已有的m(0),m(1),.m(i-1)逐一进行比较. 若不相同发一张牌,然后赋值给m(i),作为以后发牌的比较之用。 若有相同的,则重新产生随机整数x与y得z进行比较。,7.3 随机模拟,常用算法与程序设计,23,(2) 模拟大小王 注意到在升级扑克中有大小王,大小王的出现也是随机的. 把随机整数y的取值放宽到013,则z可能有100,200,300,400。 定义z=200时对应大王,z=100时对应小王,同上作打印与赋值处理。 若z=300或400,则返回重新产生x与y。,常用算法与程序设计,2
12、4,(3) 设置比较循环避免重复 在已产生i张牌并存储在m数组中,产生第i+1张牌: for(j=1;j=10000;j+) x=rand()%4+1; y=rand()%14; z=x*100+y; if(z=300 | z=400) continue; t=0; for(k=0;k=i-1;k+) if(z=mk) t=1;break; if(t=0) mi=z;break; ,常用算法与程序设计,25,(4) 打印输出 打印直接应用C语言中ASCII码16的字符显示大小王与各花色。 设置字符数组d,打印点数时把y=1,13,12,11分别转化为A,K,Q,J。 为实现真正的随机,根据时间
13、的不同,设置t=time()%10000;srand(t) 初始化随机数发生器,从而达到真正随机的目的。,常用算法与程序设计,26,7.4 操作过程模拟,【例7.10】 法国数学家泊松(Poisson)曾提出以下分酒趣题:某人有一瓶12品脱(容量单位)的酒,同时有容积为5品脱与8品脱的空杯各一个。借助这两个空杯,如何将这瓶12品脱的酒平分? 我们要解决一般的平分酒问题:借助容量分别为bv与cv(单位为整数)的两个空杯,用最少的分倒次数把总容量为偶数a的酒平分。这里正整数bv,cv与偶数a均从键盘输入。,7.4.2 泊松分酒,常用算法与程序设计,27,设 i=a/2(i为全局变量),设在分倒过程
14、中: 瓶A中的酒量为a,(0B-C顺序操作 当B杯空(b=0)时,从A瓶倒满B杯。 从B杯分一次或多次倒满C杯。 bcv-c,倒满C杯,操作 b=cv-c,倒空B杯,操作 当C杯满(c=cv)时,从C杯倒回A瓶。,常用算法与程序设计,28,若b=0且acv-c) b-=(cv-c);c=cv;/* 从B倒满C杯 */ else c+=b;b=0; /* 从B倒C,倒空B杯 */ printf(%6d%6d%6dn,a,b,c); ,常用算法与程序设计,29,(2) 按A-C-B顺序操作 这一循环操作与(1)实质上是C与B杯互换,相当于返回函数值Probe(a,cv,bv)。 同时设计实施函数Practice(a,bv,cv),与试验函数相比较,把n增1操作改变为输出中间过程量a,b,c,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度门卫服务与消防联动合同4篇
- 2025年度鲜奶产品溯源与安全监管合同3篇
- 二零二五年度体育赛事赞助合作协议模板4篇
- 2025年度速录设备租赁与技术研发合作合同3篇
- 2024年中考英语应用文写作万能模板
- 开锁公司与业主委员会协议书(2篇)
- 工程承包工伤协议书(2篇)
- 瑞丽防尘施工方案
- 二零二五版门禁系统用户身份认证与隐私保护协议4篇
- 建筑安全文明施工方案
- 课题申报书:GenAI赋能新质人才培养的生成式学习设计研究
- 外配处方章管理制度
- 中国的世界遗产智慧树知到期末考试答案2024年
- 《叶圣陶先生二三事》第1第2课时示范公开课教学PPT课件【统编人教版七年级语文下册】
- 某送电线路安全健康环境与文明施工监理细则
- GB/T 28885-2012燃气服务导则
- PEP-3心理教育量表-评估报告
- 控制性详细规划编制项目竞争性磋商招标文件评标办法、采购需求和技术参数
- 《增值税及附加税费申报表(小规模纳税人适用)》 及其附列资料-江苏税务
- 中南民族大学中文成绩单
- 危大工程安全管理措施方案
评论
0/150
提交评论