wuxiaojun 发表于 2011-4-23 22:09:03

soldier 发表于 2011-4-24 15:01:21

回复 wuxiaojun 的帖子

#include <stdio.h>
void main()
{
      int i,k,m,n,num,*p;
      printf("input the number of person:n=");
      scanf("%d",&n);
      p=num;
      for(i=0;i<n;i++)
      {
                *(p+i)=i+1;
      }
      i=0;
      k=0;
      m=0;
      //m为出圈的人数,n为总人数,因为最后要剩下一个,所以m<n-1
      while(m<n-1)
      {
                //k是要1 2 3,当当前位置的指针的值不是0的时候,k++
                if(*(p+i)!=0) k++;
                //数到3的人出圈,把该位置的指针的值赋0
                if(k==3)
                {
                        *(p+i)=0;    //k=3的时候,把当前的指针的值赋0
                        k=0;            //从头开始数
             m++;          //出圈的人数加1
                }
                i++;                  //数了多少
                if(i==n)             //数到最后一个人,(包括已经是0的位置)数了一圈,把i=0,进入下一圈
                        i=0;
      }
      while(*p==0) p++;    //找到指针的值不是0的, 就是剩下的人
      printf("the last one is N0.%d\n",*p);
}
因为这个程序是数到3的人出圈, 把数到3的对应的当前指针的值等于0,在从1开始数, 如果数到最后了, 就从头开始(i=n),这是就要把指针是0的跳过( if(*(p+i)!=0) k++;),继续, 把数到3的位置的值等于0,到最后剩下一个人的时候跳出。

wuxiaojun 发表于 2011-4-26 19:22:32

鱼C工作室.YCGZS 发表于 2015-12-14 16:26:39

:shock::shock::shock:
页: [1]
查看完整版本: 约瑟夫问题