`
liukexiong
  • 浏览: 83919 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

约瑟夫问题(非常规解法,用数组模拟报数的过程)

J# 
阅读更多
/*
 * 作者:刘克雄(转载请说明出处:http://liukexiong.iteye.com/)
 * n个人围成一圈,1,2,3循环报数,报到3的人退出.到最后只余1人,输出最后留下的是第几号
 */
#include<stdio.h>
#include<stdlib.h>

 /*
 * 用数组去模拟报数的过程
 * n:数组中的元素个数
 * given:报到几
 */

int remain(int *a,int n,int given)
{
     //现在报到几
     int count=0;
     //数组中已经有多少位置1
     int sum=0;
     //自己来控制变量i,因为i最后还要回到头部
     int i;
     for(i=0;i<n;)
    {
         //程序退出条件
         if(sum==n-1)break;
         //已经报过数
         if(*(a+i)==1)
       {
             //到达数组末尾
             if(i==n-1)
           {
               i=0;
           }
            else 
          {
               i++;
           }
        }
          //没有报过数
          else
        {
             count++;
             //报到指定的数
             if(count==given)
           {
               //报数恢复为0
               count=0;
               sum++;
               //置该位置为已经报过数
               *(a+i)=1;
            }
             //到达数组末尾
             if(i==n-1)
           {
                i=0;
            }
             else 
           {
                i++;
            }
         }
       }
   for(int j=0;j<n;j++)
 {
     if(*(a+j)==0)break;
  }
      return j+1;
}

int main()
{
    int a[]={0,0,0,0,0,0};
    int n=sizeof(a)/sizeof(a[0]);
    int given=3;
    int result=remain(a,n,given);
    printf("最后留下的是第%d号\n",result);
    return 0;
}

 

0
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics