- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
归纳法与应用
归纳法及其应用
概述
归纳法是我们解决数学问题时经常用到的,它是我们探究问题本质的一种常用方法,在信息学奥赛中也经常用到,尤其是在解决一些规律性很强的数学问题或者线性表、数字方阵等问题时,更是不可或缺。因为这类问题一般都可以通过对数组下标的控制来实现对整个数组的操作和对问题的推导,所以需要通过分析归纳出数组下标具体的变化规律来。下面通过一些实例谈谈如何归纳和控制数组下标的变化。
归纳法在解决线性表方面的应用(一维)
例1、计算S=1!+2!+3!+…+n!(n≤50),其中“!”表示阶乘,例如:5!=5*4*3*2*1,输入正整数N,输出计算结果S。
[问题分析]
本题很明显是考察高精度运算的,高精度运算的关键就是数组下标的变化。本题涉及高精度加法和乘法运算,为了提高效率,在计算当前项的值时采用递推迭代的方法,即k!=(k-1)!*k。下面的程序中使用两个一维数组s和f分别存储到当项为止的和与当前项的值。
[程序清单]
program ex1(input,output);
const maxlen=100;
type arraytype=array [0..maxlen] of longint;
var i,n:integer;
f,s:arraytype;
procedure mul(var a:arraytype; k:longint);{a存储(k-1)!,再乘以k}
var i:longint;
begin
for i:=0 to maxlen do f[i]:=f[i]*k;
for i:=0 to maxlen-1 do
begin
a[i+1]:=a[i+1]+a[i] div 10;
a[i]:=a[i] mod 10
end
end;
procedure add(var a:arraytype;b:arraytype);{a:=a+b,前若干项的和再加当前项}
var i:longint;
begin
for i:=0 to maxlen do a[i]:=a[i]+b[i];
for i:=0 to maxlen-1 do
if a[i]=10 then
begin
a[i+1]:=a[i+1]+1;
a[i]:=a[i]-10
end
end;
procedure print(a:arraytype);
var i,j:longint;
begin
i:=maxlen;
while (i0) and (a[i]=0) do i:=i-1;
for j:=i downto 0 do write(a[j])
end;
begin
write(Input n:);
readln(n);
for i:=0 to maxlen do s[i]:=0;
for i:=1 to maxlen do f[i]:=0;
f[0]:=1;
for i:=1 to n do
begin
mul(f,i);
add(s,f);
end;
print(s);
writeln
end.
例2、回文数
[问题描述]
若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个十进制数56,将56加65(即把56倒过来),得到121是一个回文数。又如:对于十进制数87:
STEP1:87+78 = 165 STEP2:165+561 = 726
STEP3:726+627 = 1353 STEP4:1353+3531 = 4884
在这里的一步是指进行了一次十进制的加法,上例最少用了4步得到回文数4884。写一个程序,给定一个N(2=N=16)进制数M,求最少经过几步(几次N进制加法)可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
样例输入:
N = 9 M= 87
样例输出:
STEP=6
[问题分析]
本题的核心是高精度加法和回文数的判断,具体处理起来可以分为4个部分:
1、对读入数据的处理。本题中的数据进制是可变的(2≤N≤16),所以用整型数(即十进制数)不是很方便,因为会出现A~F,考虑一般情况,我们可以采用字符串读入,再对数据作后期加工,把它的每一位都分离开
您可能关注的文档
最近下载
- 润滑油采购合同.doc VIP
- 2024-2025学年人教版(2024)信息技术四年级上册 第01 课 数据宝藏在身边 教学设计.docx VIP
- TQGCML 3379-2024 聚醚醚酮树脂复合材料热压成型密封箱.pdf VIP
- 2022中国幽门螺杆菌感染治疗指南.pptx VIP
- DL_T5207-2021水工建筑物抗冲磨防空蚀混凝土技术规范(附条文说明).pdf VIP
- 土力学与地基基础(第四版) 全套课件.pptx
- 医院内突发事件上报流程.pptx VIP
- 国外家校社协同研究现状、热点与前沿.docx VIP
- 2018年上半年信息安全工程师上午真题及答案解析.pdf VIP
- 配电网工程不停电作业定额应用指导意见.pdf VIP
文档评论(0)