有N 个人围成一圈,顺序排号.从第一个人开始报数(从1~~3报数),凡报到3的退出圈子,问最后留下的人原来是排在第几号?
前面有个一样的题目,比你的这题稍微难点
数据结构的典型算法(约瑟夫问题)
给个算法,主函数自己写吧
#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;
}
我写一个吧,输入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";
}
呵呵,重用性不高。