这道题就是针对N为41时才会有有一个人不死的特殊情况而设计的啊 你要是改成别的了不就偏离题意了吗?

 2006-12-25 20:07
	    2006-12-25 20:07
  编了一个,当有41个人时答案是19,改成其它的也可以,但答案可能随着改变
#define M 41
#define N 2
main()
{
 int a[M],i,flag=0,num_flag=0;
 for(i=0;i<M;i++)
  a[i]=i+1;
 printf("\noutput:\n");
 i=0;
 while(num_flag<M)
  {
   if(a[i]!=0)
     {
      flag++;
      if(flag%N==0)
       {
        printf("=>%d",a[i]);
        num_flag++;
        a[i]=0;
       }
     }
   i++;
   if(i==M)i=0;
  }
 getch();
}

 2006-12-25 20:15
	    2006-12-25 20:15
  这道题就是针对N为41时才会有有一个人不死的特殊情况而设计的啊 你要是改成别的了不就偏离题意了吗?
你的程序确实有问题,比如你改n为5时,就没有输出结果并且tc直接死了,退不出来

 2006-12-25 20:25
	    2006-12-25 20:25
  他的程序你要改的话就改两个地方,N和n,并且它们的值相同才对

 2006-12-25 20:35
	    2006-12-25 20:35
  他的程序你要改的话就改两个地方,N和n,并且它们的值相同才对
当然都改了
41只是一个特例,推出递推公式才是最重要的
这题我没做出来,我来学习一下
你们编程的思想是啥
 2006-12-25 22:16
	    2006-12-25 22:16
  这道题就是针对N为41时才会有有一个人不死的特殊情况而设计的啊 你要是改成别的了不就偏离题意了吗?
41只是一个特例,推出递推公式才是最重要的
你看题目后面一段话……										
 2006-12-25 22:18
	    2006-12-25 22:18
  /*n为人数*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i, n;
    long sum;
    while(scanf("%d", &n) != EOF)
    {
        if(n == 1)
            printf("%d\n", n);
        else
        {
            for(i = 0;;i ++)
            {
                sum = 2 << i;
                if(sum - n > 0)
                    break;
            }
            sum = 2 << (i - 1);
            printf("%ld\n", 2 * (n - sum) + 1);
        }
    }
    return 0;
}

 2006-12-26 13:42
	    2006-12-26 13:42
  #define N 40
int a[N]={0},m=N;
main()
{
    int i=0;
    while(1)
    {
       if(a[i]==0&&m>1)
       {
           i=(i+1)%N;
           while(a[i]!=0)
               i=(i+1)%N;
           a[i]=1;
           m--;
       }
       else if(a[i]==0&&m==1)
       {
            printf("the last one is %d",i+1);
            break;
       }
       else
         i=(++i)%N;
    }
    getch();
}
看看这个呢!!
 2006-12-26 18:56
	    2006-12-26 18:56