计算机常用算法与程序设计第9章-模拟.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《计算机常用算法与程序设计第9章-模拟.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 常用 算法 程序设计 模拟
- 资源描述:
-
1、 教学要求教学要求掌握竖式乘除模拟掌握竖式乘除模拟设计设计要领并应用解决多位整数要领并应用解决多位整数与指定精度的无理数高精度计算案例与指定精度的无理数高精度计算案例掌握应用随机函数模拟设计求解自然界的随机现掌握应用随机函数模拟设计求解自然界的随机现象象 本章重点本章重点根据案例的实际选择与确定模拟量,设计程序实根据案例的实际选择与确定模拟量,设计程序实现模拟。现模拟。n 设竖式除过程中被除数为设竖式除过程中被除数为a a,除数为,除数为p p,试商所得的商,试商所得的商为为b=a/pb=a/p,所得余数为,所得余数为c=a%pc=a%p。n 实施模拟,可根据问题的具体实际确定终止运算的循实施
2、模拟,可根据问题的具体实际确定终止运算的循环条件。竖式除模拟框架描述:环条件。竖式除模拟框架描述:n 输入输入 ;确定;确定 ;n while(while()n a=c a=c*t+m;/t+m;/构造被除数构造被除数a a n b=a/p;b=a/p;/实施除运算实施除运算,计算商计算商b b n printf(b);printf(b);n c=a%p;c=a%p;/试商得余数试商得余数c c n n 通常设通常设w w数组表示乘运算的一个乘数,也表示该数乘数组表示乘运算的一个乘数,也表示该数乘以以p p(另一个乘数)的积:(另一个乘数)的积:w(1)w(1)表示个位数,表示个位数,w(2)
3、w(2)为十位为十位数,数,。n 实施竖式乘模拟必须考虑进位。设进位数为实施竖式乘模拟必须考虑进位。设进位数为m m并赋初并赋初值,显然,乘数的第值,显然,乘数的第k k位数位数w(k)w(k)乘以另一个乘数乘以另一个乘数p p的结果的结果为为a=w(k)a=w(k)*p+mp+m,然后把所得到的乘积,然后把所得到的乘积a a的个位数存储为积的个位数存储为积的第的第k k位数:位数:w(k)=a%10w(k)=a%10;而;而a a的十位及以上的值做为下轮的十位及以上的值做为下轮运算的进位数:运算的进位数:m=a/10m=a/10。n w w数组(一个乘数)与进位数数组(一个乘数)与进位数m
4、m的初值、乘运算的结束的初值、乘运算的结束条件由所求问题的具体实际确定,通常使乘运算达到某条件由所求问题的具体实际确定,通常使乘运算达到某一特定值或达到某一规定位数后结束。一特定值或达到某一规定位数后结束。n 输入输入 n 确定确定 n while(while()n k=k+1;k=k+1;n a=w(k)a=w(k)*p+m;p+m;/计算乘积计算乘积a a,m m为为 n w(k)=a%10;w(k)=a%10;/乘积乘积a a的个位存储到的个位存储到w(k)w(k)n m=a/10;m=a/10;/乘积乘积a a的十位以上作为下轮的进位数的十位以上作为下轮的进位数 n n 输出输出(w(
5、d(w(d:1);1);/从高位到低位输出乘积从高位到低位输出乘积 n两位计算机爱好者两位计算机爱好者A、B在老师在老师C的指导下进行乘数探求的指导下进行乘数探求游戏:游戏:nA A:请你任给定一个正整数请你任给定一个正整数p(约整数(约整数p为个位数字不是为个位数字不是5的奇数),我可寻求正整数的奇数),我可寻求正整数q,使得,使得p与与q之积为全是之积为全是“1”组成的整数。组成的整数。nB B:也请你任给定一个正整数也请你任给定一个正整数p(同样约定整数(同样约定整数p为个位为个位数字不是数字不是5的奇数),我可寻求正整数的奇数),我可寻求正整数q,使得,使得p与与q之积为之积为全是由指
6、定的全是由指定的“23”组成的整数。组成的整数。n请完成以上两例乘数探求设计。请完成以上两例乘数探求设计。)9()8()7()6()5()4()3()2()1(aaaaaaaaa)9()8()7()6()5()4()3()2()1(aaaaaaaaan给定正整数给定正整数p(约定整数(约定整数p为个位数字不是为个位数字不是5的奇数),的奇数),寻求最小正整数寻求最小正整数q,使得,使得p与与q之积为全是之积为全是“1”组成的整数。组成的整数。n1.1.竖式除模拟设计要点竖式除模拟设计要点n设整数除竖式计算每次试商的被除数为设整数除竖式计算每次试商的被除数为a,除数为,除数为p(即(即给定的正整
7、数),每次试商的商为给定的正整数),每次试商的商为b,相除的余数为,相除的余数为c。n以余数以余数c0作为条件设置条件循环,循环外赋初值:作为条件设置条件循环,循环外赋初值:c=111,n=3;或或c=11,n=2等等。等等。n被除数被除数a=c*10+1,试商余数,试商余数c=a%p,商,商b=a/p即为所寻即为所寻求数求数q的一位。若余数的一位。若余数c=0,结束;否则,继续下一轮试商,结束;否则,继续下一轮试商,直到直到c=0为止。为止。)9()8()7()6()5()4()3()2()1(aaaaaaaaa)9()8()7()6()5()4()3()2()1(aaaaaaaaansca
8、nfscanf(%(%d,&pd,&p););nprintfprintf(寻求的最小乘数寻求的最小乘数q为:为:);nn=1;c=1;n=1;c=1;/确定初始值确定初始值n,cnwhile(cwhile(c*10+1p)10+1pnp,说明,说明乘积乘积p p*q q为若干个为若干个z z的乘数的乘数q q不存在。不存在。n(2 2)求出求出n n个个z z能被能被p p整除之后,再次模拟除运整除之后,再次模拟除运算,对每一个算,对每一个z z的每一位逐位试商,每试商一位,的每一位逐位试商,每试商一位,输出所寻求的输出所寻求的q q的一位。的一位。n/构成元素构成元素z z为为k k个数字个
9、数字djdjn/确定大于确定大于p p的由若干个的由若干个z z组成的组成的y ync=y%p;/c=y%p;/确定初始值确定初始值 nwhile(c!=0)while(c!=0)n for(j=k;j=1;j-)for(j=k;j=1;j-)n a=c a=c*10+dj;c=a%p;b=a/p;10+dj;c=a%p;b=a/p;n printf(%d,b);/printf(%d,b);/输出整数输出整数q q的一位数的一位数 n n nprintf(n printf(n 乘积乘积p p*q q为为%d%d个个%d.n,n,z);%d.n,n,z);值值 n 9.3.1 9.3.1 尾数限
10、一个数字尾数限一个数字n 整数整数n n的尾数是的尾数是9 9,把尾数,把尾数9 9移到其前面移到其前面(成为最成为最高位高位)后所得的数为原整数后所得的数为原整数n n的的3 3倍,原整数倍,原整数n n至少至少为多大为多大?n整数整数n的尾数的尾数q(限为一位)移到(限为一位)移到n的前面所得的的前面所得的数为数为n的的p倍,记为倍,记为n(q,p),这里约定,这里约定1pq9。n对于指定的尾数对于指定的尾数q与倍数与倍数p,求解,求解n(q,p)。n 设设n n为为efgwqefgwq(每一个字母表示一位数字),尾数(每一个字母表示一位数字),尾数q q移移到前面变为到前面变为qefgw
11、qefgw,它是,它是n n的的p p倍。倍。n 注意到尾数注意到尾数q q前移后数的首位为前移后数的首位为q q,而第二高位,而第二高位e e即为所即为所求求n n的首位,第三高位的首位,第三高位f f即为即为n n的第二高位,的第二高位,。n 应用竖式除模拟:第一位数应用竖式除模拟:第一位数q q除以除以p p(约定(约定qpqp),余),余数为数为c c,商为,商为b b。输出数字。输出数字b b作为所求作为所求n n的首位数。的首位数。n 进入模拟循环,当余数进入模拟循环,当余数c=0c=0且商且商b=qb=q时结束,因而循环时结束,因而循环条件为:条件为:c!=0|b!=qc!=0|
12、b!=q。n 在循环中计算被除数在循环中计算被除数a=ca=c*10+b10+b,b b为上轮试商的商;为上轮试商的商;n 试商得试商得b=a/pb=a/p,输出即,输出即n n的一位;的一位;n 求得余数求得余数c=a%pc=a%p;nscanf(“%d,%d,&q,&p);scanf(“%d,%d,&q,&p);/输入处理数据输入处理数据q,p q,p nb=q/p;c=q%p;b=q/p;c=q%p;/确定初始条件确定初始条件 nprintf(n(%d,%d)=%d,q,p,b);printf(n(%d,%d)=%d,q,p,b);/输出输出n n的首位的首位b b nwhile(c!=
13、0|b!=q)while(c!=0|b!=q)/试商循环处理试商循环处理 n a=c a=c*10+b;10+b;n b=a/p;c=a%p;b=a/p;c=a%p;/模拟整数除竖式计算模拟整数除竖式计算 n printf(%d,b);printf(%d,b);n n 设置存储数设置存储数n n的的w w数组。从尾数数组。从尾数w(1)=qw(1)=q开始,乘开始,乘数数p p与与n n的每一位数字的每一位数字w(i)w(i)相乘后加进位数相乘后加进位数m m,得,得a=w(k)a=w(k)*p+mp+m;n 积积a a的十位以上的数作为下一轮的进位数的十位以上的数作为下一轮的进位数m=a/1
14、0m=a/10;而;而a a的个位数此时需赋值给乘积的下一位的个位数此时需赋值给乘积的下一位w(i+1)=a%10w(i+1)=a%10。n 当计算的被除数当计算的被除数a a为尾数为尾数q q时结束。时结束。n scanf(%d,%d,&q,&p);scanf(%d,%d,&q,&p);n for(j=1;j100;j+)wj=0;for(j=1;j=1;j-)for(j=k-1;j=1;j-)/从高位到低位打印每一位从高位到低位打印每一位 n printf(%d,wj);printf(%d,wj);n printf(n printf(n 共共%d%d 位。位。n,k-1);n,k-1);n
15、关于圆周率关于圆周率的计算,历史非常久远。我国数学家祖冲的计算,历史非常久远。我国数学家祖冲之最先把圆周率之最先把圆周率计算到计算到3.14159263.1415926,领先世界一千多年。,领先世界一千多年。其后,德国数学家鲁特尔夫把其后,德国数学家鲁特尔夫把 计算到小数点后计算到小数点后3535位,日位,日本数学家建部贤弘计算到本数学家建部贤弘计算到4141位。据称位。据称18741874年英国数学家香年英国数学家香克斯利用微积分倾毕生精力把克斯利用微积分倾毕生精力把 计算到计算到707707位,但位,但528528位后位后的数值是错的。的数值是错的。n 应用计算机计算圆周率应用计算机计算圆
展开阅读全文