探究题参考答案Word文件下载.docx
- 文档编号:19647100
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:14
- 大小:68.40KB
探究题参考答案Word文件下载.docx
《探究题参考答案Word文件下载.docx》由会员分享,可在线阅读,更多相关《探究题参考答案Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
起始时:
1#,2#,3#3只青蛙落在L上,
第一步:
1#从L跳至叶1上,
第二步:
2#从L跳至叶2上,
第三步:
3#从L直接跳至R上,
第四步:
2#从叶2跳至R上,
第五步:
1#从叶1跳至R上,
采用归纳法:
Jump(0,y)=y+1;
意思是:
在河中没有石柱的情况下,过河的青蛙数仅取决于荷叶数,数目是荷叶数+1。
3、若Jump(S,y),先看一个最简单情况:
S=1,y=1。
从图上看出需要9步,跳过4只青蛙。
1#青蛙从L->
Y;
2#青蛙从L->
S;
1#青蛙从Y->
3#青蛙从L->
4#青蛙从L->
R;
3#青蛙从Y->
1#青蛙从S->
2#青蛙从S->
对于S=1,y=1的情形,从另外一个角度来分析若没有石柱S,最多可过y+1=2只青蛙。
有了石柱S后,最多可过2*2=4只青蛙。
步骤1:
1#和2#从L->
步骤2:
3#和4#从L->
步骤3:
1#和2#从S->
4、对于S=1,y>
1的情形若没有石柱S,最多可过y+1只青蛙。
有了石柱S后,最多可过2*(y+1)只青蛙。
前y+1只从L->
后y+1只从L->
前y+1只从S->
5、对于S=2,y>
1的情形若只有石柱S1,最多可过2*(y+1)只青蛙。
有了石柱S2后,最多可过4*(y+1)只青蛙。
前2*(y+1)只从L->
S2;
后2*(y+1)只从L->
R;
前2*(y+1)只从S2->
6、根据上述分析采用归纳法,可得出如下的递归形式:
Jump(S,y)=2*Jump(S-1,y);
先让一半的青蛙利用y片荷叶和S-1根石柱,落在河中剩下的那根石柱上;
然后让另一半的青蛙利用y片荷叶和S-1根石柱,落在右岸的R上面;
最后再让先前的一半青蛙,利用y片荷叶和S-1根石柱,落在右岸的R上面。
递归边界:
Jump(0,y)=y+1
将上述分析出来的规律写成递归形式的与或结点图为:
举例:
S=3,y=4,算Jump(3,4)
三、程序代码:
#include<
stdio.h>
intJump(ints,inty)
{inta;
if(s==0)
a=y+1;
else
a=2*Jump(s-1,y);
returna;
}
voidmain()
{ints,y,a;
printf("
请输入石柱数s="
);
scanf("
%d"
&
s);
请输入荷叶数y="
y);
a=Jump(s,y);
printf(“Jump(%d,%d)=%d\n"
s,y,a);
四、运行结果
请输入石柱数s=0
请输入荷叶数y=3
ump(0,3)=4
请按任意键继续...
请输入石柱数s=2
请输入荷叶数y=2
Jump(2,2)=12
请输入石柱数s=5
请输入荷叶数y=5
Jump(5,5)=192
探究问题3超长整数相乘
编程实现从键盘上读入两个超长正整数(可能几百上千位),计算它们的乘积并输出。
main()
{charnum1[1000],num2[1000];
intnum[2000]={0};
intn,i,j,k,p,q;
printf("
输入两个整数:
"
);
scanf("
%s"
num1);
num2);
p=strlen(num1);
q=strlen(num2);
for(n=0;
n<
p;
n++)
num1[n]=num1[n]-'
0'
;
q;
num2[n]=num2[n]-'
for(i=0;
i<
i++)
for(j=0;
j<
j++)
num[p-1-i+q-1-j]+=num1[i]*num2[j];
p+q+1;
n++)
{num[n+1]=num[n+1]+num[n]/10;
num[n]=num[n]%10;
}
for(n=p+q+1;
((int)(num[n]))==0;
n--)
k=n;
for(n=k-1;
n>
=0;
num[n]);
}
探究问题4字符串替换
试编写一函数char*my_replace(char*s1,char*s2,char*s3),实现如下功能:
把字符串s1中所有出现的字符串s2都替换成字符串s3,并通过函数名返回替换后的新字符串,但不得破坏s1。
例如,当s1="
aabcdabce"
s2="
abc"
s3="
ff"
,则函数返回的新字符串应该是"
affdffe"
。
并编写主程序调用它,并以各种输入情况(s2比s3串长、短、相等)验证其正确性。
(提示:
尽量使用系统提供的字符串操作函数strcpy,strncpy,strstr,strlen,strcat来实现)
#include<
stdlib.h>
string.h>
char*replace(char*s1,char*s2,char*s3)
{char*p,*q,*r,*s;
intl2,l3,l=0;
l2=strlen(s2);
/*串s2的长度*/
l3=strlen(s3);
/*串s3的长度*/
p=s1;
while((p=strstr(p,s2))!
=NULL)
{l++;
/*统计s2串出现的次数*/
p+=l2;
/*跳过本次出现的s2串*/
l=strlen(s1)–l*l2+l*l3+1;
/*计算替换后新字符串的长度*/
s=r=(char*)malloc(l*sizeof(char));
/*分配动态内存存放新字符串*/
while
(1)
{q=strstr(p,s2);
/*s2是否在s1中出现,q是首次出现的位置*/
if(q!
=NULL)/*q不为空,表示剩余的s1串中有s2*/
{l=q-p;
/*l为s1中出现s2串之前的长度*/
strncpy(r,p,l);
/*将s1中出现s2串之前的子串复制到新串上*/
r+=l;
/*将指向新串的指针移到串位*/
strcpy(r,s3);
/*将s3串复制到新串上,即替换了s1中的s2子串*/
r+=l3;
/*将指向新串的指针移到串位*/
p=q+l2;
/*将指向s1串的指针移到s2子串出现的位置后,
为下一次循环做好准备*/
}
else/*q为空,表示剩余的s1串中已经没有s2*/
{strcpy(r,p);
/*将s1串的剩余部分复制到新串的尾上,
注意:
这里不能用strcat*/
break;
/*终止循环*/
return(s);
/*返回指向所形成的新串的指针*/
{char*a="
*b="
*c="
*d;
d=replace(a,b,c);
result=%s\n"
d);
free(d);
探究问题5用环形链表解约瑟夫问题。
所谓环形链表,就是链表尾指针又指向了链表头,形成环状。
所谓约瑟夫问题:
就是,m个人每人一个编号:
1,2,3,…,m,排成一个圆圈,由第1个人开始报数,每报数到第n人则该人就出列,然后再由下一个重新报数,直到剩下最后1个人,并打印出编号。
/*Josephproblem*/
structnode
{
intnum;
structnode*next;
};
structnode*biuld_circle(intn)/*建立一个n元素的圈*/
structnode*head=NULL,*p,*q=NULL;
inti;
for(i=0;
i<
n;
{
if((p=(structnode*)malloc(sizeof(structnode)))==NULL)
cannotgetmemory!
),exit(0);
p->
num=i;
if(head==NULL)head=p;
elseq->
next=p;
q=p;
q->
next=head;
return(head);
voidfree_circle(structnode*head)/*释放一个圈的内存,实际上在这个程序中没有用到*/
structnode*p,*q=NULL;
for(p=head->
next;
p!
=head;
)
p=p->
free(q);
free(p);
structnode*kill(structnode*head,intcycle)/*杀人过程,一直杀到只剩一个人*/
for(p=head;
=p->
cycle-1;
free(q->
next);
return(p);
main()
intn,m;
structnode*head;
pleaseinputthenumberofpeople:
\n"
n);
pleaseinputthecycle:
m);
head=biuld_circle(n);
head=kill(head,m);
survivor:
head->
num+1);
free(head);
运行结果:
10
7
9请按任意键继续...
关于system函数的使用system(“command”);
执行shell或DOS命令。
需要#include<
process.h>
例如:
voidmain()
system("
typea.txt"
//显示a.txt文件的内容在屏幕上
pause"
//暂停
cls"
//清屏
如何显示当前时间ftime函数
//crt_ftime.c
sys/timeb.h>
time.h>
intmain(void)
struct_timebtimebuffer;
chartimeline[26];
errno_terr;
time_ttime1;
unsignedshortmillitm1;
shorttimezone1;
shortdstflag1;
_ftime(&
timebuffer);
//C4996
time1=timebuffer.time;
millitm1=timebuffer.millitm;
timezone1=timebuffer.timezone;
dstflag1=timebuffer.dstflag;
printf("
Secondssincemidnight,January1,1970(UTC):
%I64d\n"
time1);
Milliseconds:
%d\n"
millitm1);
MinutesbetweenUTCandlocaltime:
timezone1);
Daylightsavingstimeflag(1meansDaylighttimeisin"
"
effect):
dstflag1);
err=ctime_s(timeline,26,&
(timebuffer.time));
if(err)
Invalidargumenttoctime_s."
Thetimeis%.19s.%hu%s"
timeline,timebuffer.millitm,&
timeline[20]);
1356364050
359
-480
Daylightsavingstimeflag(1meansDaylighttimeisineffect):
0
ThetimeisMonDec2423:
47:
30.3592012
================================================================
如何计时,估计一个程序的运行时间,以改进程序time函数
sys/types.h>
intmain()
{time_ttime1,time2;
//自1970年1月1日以来的总的秒数
intj=0,k=0;
time(&
time1);
//起始时间
while(j<
100)
j++;
k=0;
while(k<
100000000)
k++;
time2);
//终止时间
time=%ds\n"
time2-time1);
//时间差,即为中间程序段运行所用时间
time=34s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 探究 参考答案