探究题参考答案.docx
- 文档编号:6633350
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:14
- 大小:68.40KB
探究题参考答案.docx
《探究题参考答案.docx》由会员分享,可在线阅读,更多相关《探究题参考答案.docx(14页珍藏版)》请在冰豆网上搜索。
探究题参考答案
探究问题1黑色星期五问题
有些西方人比较迷信,如果某个月的13号正好是星期五,这天被称为“黑色星期五”,他们就会觉得不太吉利。
你能否编写程序,统计出在某个年份中,出现了多少次“黑色星期五”,并给出这一年出现“黑色星期五”的月份。
并探究自公元1年以来,一年中最多会出现几次黑色星期五、最少会出现几次黑色星期五,是否可能某一年没有黑色星期五?
已经在“C语言09.ppt”中77页解答。
探究问题2递归算法实现青蛙过河问题
一、问题描述
一条小溪尺寸不大,青蛙可以从左岸跳到右岸,在左岸有一石柱L,面积只容得下一只青蛙落脚,同样右岸也有一石柱R,面积也只容得下一只青蛙落脚。
有一队青蛙从尺寸上一个比一个小。
我们将青蛙从小到大,用1,2,…,n编号。
规定初始时这队青蛙只能趴在左岸的石头L上,当然是一个落一个,小的落在大的上面。
不允许大的在小的上面。
在小溪中有S个石柱,有y片荷叶,规定溪中的柱子上允许一只青蛙落脚,如有多只同样要求一个落一个,大的在下,小的在上。
对于荷叶只允许一只青蛙落脚,不允许多只在其上。
对于右岸的石柱R,与左岸的石柱L一样允许多个青蛙落脚,但须一个落一个,小的在上,大的在下。
当青蛙从左岸的L上跳走后就不允许再跳回来;同样,从左岸L上跳至右岸R,或从溪中荷叶或溪中石柱跳至右岸R上的青蛙也不允许再离开。
问在已知溪中有S根石柱和y片荷叶的情况下,最多能跳过多少只青蛙?
二、程序设计思想
定义函数
Jump(S,y)——最多可跳过河的青蛙数
其中:
S——河中柱子数
y——荷叶数
1、当河中无柱子时:
即S=0,Jump(0,y)当y=1时,
Jump(0,1)=2说明:
河中有一片荷叶,可以过两只青蛙,起始时L上有两只青蛙,1#在2#上面。
第一步:
1#跳到荷叶上;第二步:
2#从L直接跳至R上;第三步:
1#再从荷叶跳至R上。
2、当y=2时,
Jump(0,2)=3;
说明:
河中有两片荷叶时,可以过3只青蛙。
起始时:
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->S;
3#青蛙从L->Y;
4#青蛙从L->R;
3#青蛙从Y->R;
1#青蛙从S->Y;
2#青蛙从S->R;
1#青蛙从Y->R;
对于S=1,y=1的情形,从另外一个角度来分析若没有石柱S,最多可过y+1=2只青蛙。
有了石柱S后,最多可过2*2=4只青蛙。
步骤1:
1#和2#从L->S;
步骤2:
3#和4#从L->R;
步骤3:
1#和2#从S->R;
4、对于S=1,y>1的情形若没有石柱S,最多可过y+1只青蛙。
有了石柱S后,最多可过2*(y+1)只青蛙。
步骤1:
前y+1只从L->S;
步骤2:
后y+1只从L->R;
步骤3:
前y+1只从S->R;
5、对于S=2,y>1的情形若只有石柱S1,最多可过2*(y+1)只青蛙。
有了石柱S2后,最多可过4*(y+1)只青蛙。
步骤1:
前2*(y+1)只从L->S2;
步骤2:
后2*(y+1)只从L->R;
步骤3:
前2*(y+1)只从S2->R;
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
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);
printf("请输入荷叶数y=");
scanf("%d",&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超长整数相乘
编程实现从键盘上读入两个超长正整数(可能几百上千位),计算它们的乘积并输出。
#include
main()
{charnum1[1000],num2[1000];
intnum[2000]={0};
intn,i,j,k,p,q;
printf("输入两个整数:
");
scanf("%s",num1);
scanf("%s",num2);
p=strlen(num1);
q=strlen(num2);
for(n=0;n
num1[n]=num1[n]-'0';
for(n=0;n num2[n]=num2[n]-'0'; for(i=0;i for(j=0;j num[p-1-i+q-1-j]+=num1[i]*num2[j]; for(n=0;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;n--) printf("%d",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 #include #include 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));/*分配动态内存存放新字符串*/ p=s1; 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);/*返回指向所形成的新串的指针*/ } voidmain() {char*a="aabcdabce",*b="abc",*c="ff",*d; d=replace(a,b,c); printf("result=%s\n",d); free(d); } 探究问题5用环形链表解约瑟夫问题。 所谓环形链表,就是链表尾指针又指向了链表头,形成环状。 所谓约瑟夫问题: 就是,m个人每人一个编号: 1,2,3,…,m,排成一个圆圈,由第1个人开始报数,每报数到第n人则该人就出列,然后再由下一个重新报数,直到剩下最后1个人,并打印出编号。 /*Josephproblem*/ #include #include structnode { intnum; structnode*next; }; structnode*biuld_circle(intn)/*建立一个n元素的圈*/ { structnode*head=NULL,*p,*q=NULL; inti; for(i=0;i { if((p=(structnode*)malloc(sizeof(structnode)))==NULL) printf("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;) { q=p; p=p->next; free(q); } free(p); } structnode*kill(structnode*head,intcycle)/*杀人过程,一直杀到只剩一个人*/ { structnode*p,*q=NULL; inti; for(p=head;p! =p->next;) { for(i=0;i { q=p; p=p->next; } p=p->next; free(q->next); q->next=p; } return(p); } main() { intn,m; structnode*head; printf("pleaseinputthenumberofpeople: \n"); scanf("%d",&n); printf("pleaseinputthecycle: \n"); scanf("%d",&m); head=biuld_circle(n); head=kill(head,m); printf("survivor: %d",head->num+1); free(head); } 运行结果: pleaseinputthenumberofpeople: 10 pleaseinputthecycle: 7 survivor: 9请按任意键继续... 关于system函数的使用system(“command”);执行shell或DOS命令。 需要#include 例如: #include #include voidmain() { system("typea.txt");//显示a.txt文件的内容在屏幕上 system("pause");//暂停 system("cls");//清屏 } 如何显示当前时间ftime函数 //crt_ftime.c #include #include #include 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); printf("Milliseconds: %d\n",millitm1); printf("MinutesbetweenUTCandlocaltime: %d\n",timezone1); printf("Daylightsavingstimeflag(1meansDaylighttimeisin" "effect): %d\n",dstflag1); err=ctime_s(timeline,26,&(timebuffer.time)); if(err) { printf("Invalidargumenttoctime_s."); } printf("Thetimeis%.19s.%hu%s",timeline,timebuffer.millitm,&timeline[20]); } 运行结果: Secondssincemidnight,January1,1970(UTC): 1356364050 Milliseconds: 359 MinutesbetweenUTCandlocaltime: -480 Daylightsavingstimeflag(1meansDaylighttimeisineffect): 0 ThetimeisMonDec2423: 47: 30.3592012 请按任意键继续... ================================================================ 如何计时,估计一个程序的运行时间,以改进程序time函数 #include #include #include #include intmain() {time_ttime1,time2;//自1970年1月1日以来的总的秒数 intj=0,k=0; time(&time1);//起始时间 while(j<100) { j++; k=0; while(k<100000000) k++; } time(&time2);//终止时间 printf("time=%ds\n",time2-time1);//时间差,即为中间程序段运行所用时间 } 运行结果: time=34s 请按任意键继续...
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 探究 参考答案