功德最大的佛经:求救c语言高手!!!!!

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/30 03:59:34
谁能帮我解释一下下面这个程序!兄弟在此谢过了!!!

大花猫是捕捉老鼠的能手,每天要抓到不少老鼠.但是它吃老鼠之前,先要老鼠列队倒数,第一批吃掉报单数;剩下的老鼠重新报数,第二批仍吃掉报单数的;...最后剩下的一只老鼠可以被保留,与第二天抓来的老鼠一起重新排队报数.一连好几天,大花猫发现最后留下来的都是一只机灵的小白鼠.当大花猫问他,想什么办法天天都能留下来时,小白鼠说:”每天排队以前,我都先数一数你抓到了多少只老鼠,然后,我站在一个合适的位置上.问题是小白鼠每天每天在什么位置上才不被吃掉?请详细讲解并编程求解.
main()
{int a[10000],n;
void fun1(int a[ ],int n);
int fun2(int a[ ],int n);
scanf("%d\n",&n);
fun1(a,n);
fun2(a,n);
}
void fun1(int a[ ],int n)
{
int i,j=1;
for(i=1;i<=n;i++)
{a[i]=j;j++;}
printf("排列:\n");
for(i=1;i<=n;i++)
{printf("%d\t",a[i]);}
}

int fun2(int a[ ],int n)
{int i,j,N,b[1000];
N=n/2;
for(i=2,j=1;i<=n,j<=N;i=i+2,j++)
{
b[j]=a[i];
}
printf("\n排列:\n");
for(j=1;j<=N;j++)
printf("%d\t",b[j]);
if(N>1)
return fun2(b,N);
else
printf("\n结果:\n%d",b[N]);
}
二楼的高手果然厉害,但是还是看不懂,你可以帮我解释一下吗??谢谢了!!!!

//主函数声明了两个子函数fun1,fun2
//fun1初始化排列,即一天抓到的初始的老鼠排列
//fun2使用递归,获得最终活下来的那只老鼠的编号
main()
{int a[10000],n;
void fun1(int a[ ],int n);
int fun2(int a[ ],int n);
scanf("%d\n",&n); //输入一开始抓到的老鼠数目
fun1(a,n); //初始化老鼠排列
fun2(a,n); //吃掉单号的老鼠,返回最后一只老鼠编号
}
void fun1(int a[ ],int n)
{
int i,j=1;
//循环语句赋值,如a[1]=1,a[2]=2,...
/*初始化老鼠排列,数组的下标即为排列顺序,a[1,3,...]将会被吃掉;数组元素的具体数值即为老鼠的具体编号*/
for(i=1;i<=n;i++)
{a[i]=j;j++;}
printf("排列:\n"); //向屏幕输出初始排列
for(i=1;i<=n;i++)
{printf("%d\t",a[i]);}
}

int fun2(int a[ ],int n)
{int i,j,N,b[1000];
N=n/2; //每吃掉一轮,老鼠的数目就会剩n/2
//循环保留双号,即剔除单号老鼠(a[1,3,5,...])
for(i=2,j=1;i<=n,j<=N;i=i+2,j++)
{
b[j]=a[i];
//保留双号老鼠至新数组b[1,2,3...,N]=a[2,4,6...]
}
printf("\n排列:\n");
//向屏幕显示新数组b排列,即吃掉一轮后剩余的老鼠编号
for(j=1;j<=N;j++)
printf("%d\t",b[j]);
//如果新数组b长度N>1,调用fun2自身,即递归
//否则,N<=1,即只剩一只老鼠,输出这最后一只老鼠的编号
if(N>1)
return fun2(b,N);
else
{
printf("\n结果:\n%d",b[N]);
return b[N];
}
}
//递归调用中,fun2(b,N)的第二个参数N会不断减半,直到满足了N<=1,fun2将获得一个返回值,即最后一只老鼠的编号

#include <stdio.h>
void main()
{
int pos = 1;
int horseCount;

do
{
printf("Please Input The Count of The Horse,Count > 1:");
scanf("%d",&horseCount);
}while(horseCount<=1);

while(((pos = pos<<1)<<1) <= horseCount);

printf("The Position is %d\n",pos);
}

还是我来回答这个问题吧,不管你能不能理解,但是不能否定我这个解决方案的代码精简度和效率,不明白可以问,如果觉得我这个有点水平,把红旗给我就可以了。
其实解决问题的只有下边的While,上边的While只是控制输入的,怕不输入的数字小于1了没意义。
这个问题如果只在看表面不实际分析,上面各位的行行代码你就慢慢分析吧。