C语言关于循环报数

来源:百度知道 编辑:UC知道 时间:2024/05/23 16:05:48
17个人站成一圈,进行报数。编号从0开始,报数1~3,凡是报到3的退出来,最后剩下一个人,要求输出这个人原来的编号。
一直想不通呀。。。谢谢各位大哥了,麻烦写详细点,要注明下。请不要用什么指针那个什么东西,在网络上虽然找到答案了,但是他们的时针方法我们还没有学呀。要求只用数组和循环来做。
再次谢谢了。
请不要用这种什么list *p,*q;,这种我们还没教呀。大哥 晕,没人会呀。
我自己想出来了。供你们参考下吧。花了好几个小时哦。珍惜成果,哈。】
完美答案(如有雷同,纯属巧合)
# include<stdio.h>
void main()
{
int a[17],b[17],i, j=-1,k; |*定义两个数组*|
for(i=0;i<17;i++) {a[i]=i;b[i]=1;} |*赋予数组a编号的变量,数组b为标记孩子是否出列的变量*|
for(i=0;i<16;i++)|* 为什么要使i循环16次就好呢?自己猜*|
{
for(k=1;k<=3; ) |*开始数数,从1数到3,
为什么不加条件三呢,自己想*|
{
j=(j+1)%17; |* 最关键的一步,让数组到末尾后,
跳回重新开始*|
if(b[j]==1) k++;|* 原来条件三补在这里*|
}
b[j]=0; |* 也是关键的一步,屏蔽数到的孩子,赋予0*|
}
for(i=0;i<17;i++)
{ if(b[i]= =1) |*选出没有数到的最后一个孩子,因为只输了16次,所以,最后会剩下一个,这就是为什么只数16次!!*|
printf("the last one is %d\n",a[i]); 注意最后面的打印要用数组a,这是这个数组在这个编程中的唯一作用。
}
}

m,n都可以输入。
s设为“1”。
这些稍稍改动就可以符合您的要求!
此种问题叫做约瑟夫环问题
*****************************

用数组作:
#include<iostream>
using namespace std;
int main()
{
int n,start,offset,i=0,count=0;;
cout<<"总数,开始数,偏移数!"<<endl;
cin>>n>>start>>offset;
int *persons=new int[n];
for(int i=0;i<n;i++)persons[i]=0;
start--;
while(1)
{
if(persons[start])start=(start+1)%n;
else
{
cout<<"第"<<start+1<<"个出局"<<endl;
count++;
if(count==n)break;
persons[start]=1;