狼找兔子问题
我們先做一個假設,你圍著400米的環(huán)形跑道跑步,分多
次(整數(shù)次)跑,每次跑150米,如果你想回到原出發(fā)點,
那么毫無疑問你跑的最短總路程為400米的整數(shù)倍同時也
是150米的整數(shù)倍并且為最小公倍數(shù)1200米,需要經(jīng)過
1200/150=8次奔跑。
經(jīng)過以上分析,我想你已經(jīng)明白了狼找兔子經(jīng)過的最小總
山洞數(shù)目為n、m的最小公倍數(shù),假設該公倍數(shù)為k,
那么狼搜索過的山洞為k/m個。如果完成整個過程狼搜索過的山洞為n,那么兔子便無處藏身( 即k/m=n亦即k=mn)。
在數(shù)學中我們已經(jīng)知道(mn)/ (m, n的最大公約數(shù)) =k,
由此可知當最大公約數(shù)為1時剛好滿足兔子無藏身之地,
同時我們也可以知道m(xù)、n的最大公約數(shù)不為1時兔子有藏
身之地。
方法流程圖:
左邊為常規(guī)方法,但是方法需要一段時間思考得出;
右邊為鏈表方法,較為簡單。
方法一
/*狼找兔子需要經(jīng)過的山洞數(shù)m,n的最小公倍數(shù)k 狼搜索過的山洞應為k/m個,所以當m,n的最大公約數(shù)為1時,兔子必死*/ #include <stdio.h> int check(int n,int m); int main(){int m,n,temp;scanf("%d %d",&m,&n);temp=check(n,m);if(temp==1){printf("兔子不能幸免!!!\n");}else{printf("兔子幸免,位置在:%d\n",temp);} } int check(int n,int m){int i,k,t;k=m<n?m:n;for(i=1;i<=k;i++){if(m%i==0&&n%i==0){t=i;}}return t; }方法二
#include <stdio.h> #include <stdlib.h> #include <windows.h> typedef struct shandong{ int num; int state; struct shandong *next; }cave; void createlist(cave *head,int n) {//創(chuàng)建鏈表并初始化,p->state =0代表狼未進山洞 cave *p,*q; int i; p=head; for(i=0;i<n-1;i++){ p->num=i; p->state=0; q=(cave *)malloc(sizeof(cave)); p->next=q; p=q; } p->num=n-1; p->state=0; p->next=head; } // void search_rabbit(cave *head,int m) {// cave *p; int i; p=head; p->state=1; //檢查 山洞 for(i=0;i<m;i++) p=p->next; //跳過m個 山洞 while(head->num!=p->num){ p->state=1; //檢查山洞 for(i=0;i<m;i++) p=p->next; //跳過m個山洞 }} // void print_result(cave *head,int n) {// int i; int count=0; cave *p; p=head; for(i=0;i<n;i++){ if(p->state==0){ ++count; printf("第%個山洞安全! \n",p->num); } p=p->next; } if(count==0) printf("這只兔子死定了! \n"); else printf("安全的山洞共有%d個。\n",count); } // void main(){ int m,n; LARGE_INTEGER t1 ,t2,tc; double t; cave *head=(cave *)malloc(sizeof(cave)); printf("山洞的數(shù)目n(int類型且n>0)="); scanf("%d" ,&n); printf("每次跳過山洞的數(shù)目m(int類型且m>0)="); scanf("%d",&m); createlist(head,n); QueryPerformanceFrequency(&tc); QueryPerformanceCounter(&t1); search_rabbit(head,m); QueryPerformanceCounter(&t2); print_result(head,n); //I printf("Begin Time:%u\n",t1 .QuadPart); // printf("End Time:%u\n",t2.QuadPart); t=(double)(1000000000*(t2.QuadPart-t1.QuadPart))/tc.QuadPart; printf("Lasting Time: %f 納秒。\n",t); }總結
- 上一篇: 给一维数组输入6个整数,假设为5,7,4
- 下一篇: 读入自然数m、n,判断m/n是有限小数还