| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 646 人关注过本帖
标题:一题不解
只看楼主 加入收藏
心动音符
Rank: 1
等 级:禁止访问
威 望:1
帖 子:832
专家分:0
注 册:2005-9-15
收藏
 问题点数:0 回复次数:8 
一题不解

有N 个人围成一圈,顺序排号.从第一个人开始报数(从1~~3报数),凡报到3的退出圈子,问最后留下的人原来是排在第几号?

2006-04-26 10:42
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

前面有个一样的题目,比你的这题稍微难点


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-04-26 12:40
zwfc
Rank: 1
等 级:新手上路
帖 子:65
专家分:0
注 册:2005-10-17
收藏
得分:0 
可以定义一个数组 a[n] n代表n个人。一开始,把数组元素全部初始化0;定义一个变量m 初始化0 ,然后,1~3循环,每到3时把那个元素改为1,同时,m++;后判断 m==n 是否成立。如成立,则那个变为1的元素的下标+1 即最后留下的人序号。
注意:1.这个循环是双向的。2.如果a[i]==1,则 continue;
3.n=1要特殊处理。

2006-04-26 13:11
luyx66
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2006-3-29
收藏
得分:0 

数据结构的典型算法(约瑟夫问题)
给个算法,主函数自己写吧
#define max 50
#include<iostream.h>
void josophos(int n,int m)
{
int i,flag;
int a[max];
for (i=0;i<n;i++)
a[i]=i+1;//数组元素等于下标加1
flag=0;
cout<<"输出序列:"<<endl;
for(i=n;i>=1;i--)
{
flag=(flag+m-1)%i;//找到符合标志(例如上面提到的数到3,即m=3)的数组元素的下标
cout<<a[flag];// 将符合的元素取出
for(flag=flag+1;;flag<n;flag++)
a[flag-1]=a[flag];//继续循环数数
}
cout<<endl;

}

2006-04-26 19:22
ElfDN
Rank: 4
等 级:贵宾
威 望:11
帖 子:291
专家分:0
注 册:2005-11-13
收藏
得分:0 
这个题目不应该模拟,应该用合理的数学方法来解

2006-04-26 20:56
风雪
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-4-27
收藏
得分:0 
稍微翻一翻一月内的贴子就能找到。

2006-04-27 12:30
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
这道题我以前没看过
是不是用递归会更好一些..
作个函数
让他们数组变量+1
然后付给递归做实参(%3==0的continue不付值)

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-04-27 12:49
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

我写一个吧,输入2个数字,第一个是参加游戏的人数,第2个是count的值,你这题是3。
#include <iostream>

void Instruct();
int main()
{
Instruct();
std::cout<<"Enter the total number of people attending this game.\n";
int N;
std::cin>>N;
std::cout<<"Enter the fixed number to count.\n";
int num;
std::cin>>num;
int s[N];int sum=0;int j=1;
for(int i=0;i<N;i++){s[i]=1;sum+=s[i];}
for(int i=0;sum!=1;i++)
{
i%=N;while(s[i]==0){i++;i%=N;}
if(j%num==0)
{
s[i]=0;sum--;
}j++;
}
for(int i=0;i<N;i++)if(s[i]==1)
std::cout<<"The number of people who left at last is :\n"<<i+1<<'\n';
system("pause");
return 0;
}

void Instruct()
{
std::cout<<"Here is a game!First,many people round a turn and \n"
"give them the serial number from 1 to the total number of people.\n"
"Then we start count.\n"
"When we count a fixed number we let the person leave.\n"
"Let guess the last man?\n\n";
}
呵呵,重用性不高。


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-04-28 14:09
lbwxqh
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2006-4-12
收藏
得分:0 

看这个算法行不行:
int m=0,n=30//m用来表示每个人报的数,n表示还在参加游戏的人数,这里暂定为30;
int a[30];
for(int i=0;i<30)a[i]=1;//a[i]用来判断第i+1个人是否还在这个游戏中,一开始都在这个游戏中;
while(n!=1)
{
for(i=1;i<31;i++)
{
if(a[i-1]==1)m++;
if(m%3==0){a[i-1]=0;n--;}
}
}
for(i=1;i<31;i++)
if(a[i-1]==1){cout<<i;break;}

2006-04-29 18:00
快速回复:一题不解
数据加载中...
 
   



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

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