读书人

n个数,1,2,3这样报数,报到3的退出,问最

发布时间: 2012-02-14 19:19:19 作者: rapoo

n个数,1,2,3这样报数,报到3的退出,问最一个数是多少?
n个数,1,2,3这样报数,报到3的退出,问最一个数是多少?

请问大家是怎么解决的
我想看下高效的处理方法
学习下,谢谢大家来支持

[解决办法]
/*递归实现*/
#include <iostream>
using namespace std;
//本程序以从1开始数,数到3离队为例,其它情况只用少加修改
void make(int *base,int n,int pos,int c)
{
int j=0;
cout < < "NO. " < <++c < < " 第 " < <pos+1 < < "位出列 " < <endl;//输出
base[pos]=0;//踢掉
if(c==n)return; //出口
while(j-3)if(base[pos=(pos+1)%n])j++;//递归点 ,每次数到几这个3就改到几
make(base,n,pos,c);//递归
}
int main()
{
int n,c=0,pos=2;//从N开始数,则把pos改为N-1就行了.
cout < < "请输入总人数 " < <endl;
cin> > n;
int *base=new int[n];
for(int i=0;i <n;i++)base[i]=1;
make(base,n,pos,c);
delete[]base;
system( "PAUSE ");
return 0;
}
[解决办法]
#include <stdio.h>
int main( void )
{
int n, i = 0, m = 3, p;
scanf( "%d ", &n); //n总人数
while( ++i <= n )
{
p = i * m;
while (p > n)
p = p - n + (p - n - 1)/(m - 1);
printf( "%d\n ", p);
}
char ch;
while(ch = getchar() != EOF && ch != '\n ');
getchar();
return 0;
}
[解决办法]
是约瑟夫问题,具体可以去看一下 具体数学 
里边有详细的分析
[解决办法]
get_last(int n,int m)
{
int retval = 0;
int i;

if(n < 2)
return retval;
for(i = 2;i <= n;i++)
retval = (retval + m) % i;
return retval + 1;
}

读书人网 >C语言

热点推荐