| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6094 人关注过本帖
标题:Josephus问题
只看楼主 加入收藏
hujian100
Rank: 1
等 级:新手上路
帖 子:69
专家分:0
注 册:2006-9-14
收藏
得分:0 

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


2006-12-25 20:07
wyzn12
Rank: 1
等 级:新手上路
帖 子:129
专家分:0
注 册:2006-10-28
收藏
得分:0 

编了一个,当有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
wyzn12
Rank: 1
等 级:新手上路
帖 子:129
专家分:0
注 册:2006-10-28
收藏
得分:0 
以下是引用hujian100在2006-12-25 20:07:57的发言:

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

你的程序确实有问题,比如你改n为5时,就没有输出结果并且tc直接死了,退不出来


新王登基,血流成河!
2006-12-25 20:25
wyzn12
Rank: 1
等 级:新手上路
帖 子:129
专家分:0
注 册:2006-10-28
收藏
得分:0 
以下是引用crusoe在2006-12-24 21:13:30的发言:
怪了,楼上的你的程序为啥当N小于41的时候,就出不来结果了?

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


新王登基,血流成河!
2006-12-25 20:35
crusoe
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-12-24
收藏
得分:0 
以下是引用wyzn12在2006-12-25 20:35:00的发言:

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

当然都改了
41只是一个特例,推出递推公式才是最重要的
这题我没做出来,我来学习一下
你们编程的思想是啥

2006-12-25 22:16
crusoe
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-12-24
收藏
得分:0 
以下是引用hujian100在2006-12-25 20:07:57的发言:

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

41只是一个特例,推出递推公式才是最重要的
你看题目后面一段话……

2006-12-25 22:18
zhanghuan_10
Rank: 1
等 级:新手上路
威 望:2
帖 子:751
专家分:0
注 册:2006-10-25
收藏
得分:0 
[CODE]

/*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;
}

[/CODE]

该学习了。。。
2006-12-26 13:42
拯救未来
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-12-26
收藏
得分:0 

#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
快速回复:Josephus问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036789 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved