问题描述
- 请大家看看这个程序错在哪。谢谢。
-
#include
#include
#include
void monkey(int, int, int);
int main(void)
{
int n;
scanf("%d", &n);
int i;
for (i = 1; i <= n; i++)
{
int n, m, p;
scanf("%d %d %d", &n, &m, &p);
monkey(n, m, p);
}
return 0;
}
void monkey(int n, int m, int p)
{
int *ar = (int *)malloc((n + 1)*sizeof(int));
memset(ar, 0, n + 1);
int out =n;
int now = p - 1;
while (out-1)
{
int i;
for (i = 1; i <= m; i++)
{
if (now + 1 > n)
now = 1;
else
++now;
if (ar[now])
--i;
if (!(ar[now]) && i == m)
ar[now] = 1;
}
--out;
}
printf("%3dn", now);
free(ar);
}
解决方案
int i=0;
while( i<N)//这地方刚打错了,应该看得出
{
if(mon[p++])//猴子数组都初始化为1,首次报数为真
i++;
解决方案二:
1、最好不要用同名变量。
2、memset第3个参数表示字节数要用(n + 1)*sizeof(int)
3、printf("%03dn", now);
解决方案三:
以前写了个一样的你看看
#include
#define MAX 100
#define step 3
#define begin 1
int main()
{
int n,cnt,i=0,j=0;
int M,N,P;
int a[MAX];
scanf("%d%d%d",&M,&N,&P);
cnt=M;
while(i
for( i=P-1,j=1;cnt>1;i==M-1?i=0:i++)
{
if(a[i]!=1) {
if(j==N){
a[i]=1;
j=1;
// printf("%d outn",i+1);
--cnt;
}
else
j++;
}
}
for(i=0;a[i];i++);
printf("%3d",i+1);
}
解决方案四:
错的太多,
void monkey(int N, int m, int p)//N为报数,m为参与猴子数量,p为当前开始报数的猴子编号
{
char * mon=(char*)malloc(m);
int TotalMonkey=m;
memset(mon,1,m);
while(m>1)//只剩最后一只猴子时退出循环
{
int i=0;
while( i
{
if(mon[p++])//猴子数组都初始化为1,首次报数为真
i++;
if(p>TotalMonkey)
p%=TotalMonkey;
}
mon[p-1]=0;
--m;
}
for遍历mon[],输出值为真的元素的下标即为猴王的序号
}
解决方案五:
这样改一下吧,你的循环有问题,进入死循环了
void monkey(int, int, int);
int main(void)
{
int n, m, p; //数量,顺序 当前位置
scanf("%d %d %d", &n, &m, &p);
monkey(n, m, p);
return 0;
}
void monkey(int n, int m, int p)
{
int *ar = (int *)malloc((n)*sizeof(int));
memset(ar, 0, n);
int out =n;
int now = p - 1;
while (out-1)
{
int i;
int count=0;
for (i = 1; count < m; i++)
{
count++;
if (!ar[now])
--count;
if (now >= n)
now = 0;
else
++now;
if (count == m)
{
ar[now] = 1;
}
}
--out;
}
printf("%3dn", now);
free(ar);