- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
模拟概述
?教学要求
掌握竖式乘除模拟设计要领并应用解决多位整数与指定精度的小数等高精度计算案例
掌握应用随机函数模拟设计求解自然界的随机现象
?本章重点
根据案例的实际选择与确定模拟量;
模拟自然界的随机现象与特定条件下的操作过程,可解决一些人工操作力所不及的疑难问题。
根据模拟对象的不同特点,计算机模拟可分为决定性模拟与随机性模拟。
决定性模拟是对决定性过程进行的模拟,其模拟的事件按其固有的规律发生发展,最终得出一个明确的结果。
例如,乘除竖式计算模拟就是决定性模拟,应用模拟整数的竖式乘除计算可快捷求解一些高精度计算问题,结果是确定的。
随机性模拟的对象是随机事件,其变化过程相当复杂。随机模拟要利用计算机语言提供的随机函数,设定某一范围内的随机值,并将这些随机值作为参数实施模拟。
例如数字模拟(又称数字仿真),可进行一些疑难定积分的近似计算。;8.1 竖式乘除模拟; 设竖式除过程中被除数为a,除数为p,试商所得的商为b=a/p,所得余数为c=a%p。
实施模拟,可根据问题的具体实际确定终止运算的循环条件。竖式除模拟框架描述:
输入原始数据;确定初始量;
while(循环条件)
{ a=c*t+m; // 构造被除数a
b=a/p; // 实施除运算,计算商b
printf(b);
c=a%p; // 试商得余数c
}; 通常设w数组表示乘运算的一个乘数,也表示该数乘以p(另一个乘数)的积:w(1)表示个位数,w(2)为十位数,…。
实施竖式乘模拟必须考虑进位。设进位数为m并赋初值,显然,乘数的第k位数w(k)乘以另一个乘数p的结果为a=w(k)*p+m,然后把所得到的乘积a的个位数存储为积的第k位数:w(k)=a%10;而a的十位及以上的值做为下轮运算的进位数:m=a/10。
w数组(一个乘数)与进位数m的初值、乘运算的结束条件由所求问题的具体实际确定,通常使乘运算达到某一特定值或达到某一规定位数后结束。;竖式乘模拟框架描述:; 两位计算机爱好者A、B在老师C的指导下进行乘数探求:
A: 请你任给定一个正整数p(约整数p为个位数字不是5的奇数),我可寻求正整数q,使得p与q之积为全是“1”组成的整数。
B: 也请你任给定一个正整数p(同样约定整数p为个位数字不是5的奇数),我可寻求正整数q,使得p与q之积为全是由“2011”组成的整数。
C: 可以适当拓广,当积的构成由键盘任意指定时,继续你们的乘数探求。
请完成以上三例乘数探求设计。;1. 竖式除模拟设计
设整数除竖式计算每次试商的被除数为a,除数为p(即给定的正整数),每次试商的商为b,相除的余数为c。
以余数c≠0作为条件设置条件循环,循环外赋初值:c=111,n=3;或c=11,n=2等等。
被除数a=c*10+1,试商余数c=a%p,商b=a/p即为所寻求数q的一位。若余数c=0,结束;否则,继续下一轮试商,直到c=0为止。
每商一位,设置变量n统计积中“1”的个数,同时输出商b(整数q的一位数)。;scanf(%d,p);
n=3; c=111; // 确定初始值
while(c!=0)
{ a=c*10+1;
?c=a%p; b=a/p; n++; // 实施除乘竖式计算模拟
printf(“%d”,b); // 输出整数q的一位数
}
printf(\n乘积p*q为%d个1.\n,n);;8.2.2 积为若干个2011构成;scanf(%ld,p);
n=1; b=2011/p; c=2011%p; // 确定初始值
if(b0) printf(%ld,b);
while(c!=0)
{ n++; a=c*10000+2011;
c=a%p; b=a/p; // 实施除竖式计算模拟
printf(%04d,b); // 输出前补“0”的4位数b
}
printf(\n 乘积p*q为%ld个2011.\n,n);;8.2.3 积的任意指定构成;// 构成元素z为k个数字d[j]
// 确定大于p的由若干个z组成的y
c=y%p; // 确定初始值
while(c!=0)
{ for(j=k;j=1;j--)
{ a=c*10+d[j]; c=a%p; b=a/p;
printf(%d,b); // 输出整数q的一位数
}
}
printf(\n 乘积p*q为%d个%d.\n,n,z)
文档评论(0)