void main()
{int a[100],i,quit_num,k,n;
void main()
{int a[100],i,quit_num,k,n;
printf("input number:");
scanf("%d",&n);
for(i=0;i<n;i++)/*数组a存放原始编号*/
a[i]=i+1;
quit_num=0;/*出圈人数*/
i=0;
k=0;
while(quit_num<n-1)/*直到只剩下1人时*/
{if(a[i]!=0)k++;
if(k==3)
{a[i]=0;
quit_num++;
k=0;
}
i++;
if(i==n)i=0;
}
for(i=0;i<n;i++)
if(a[i]!=0)printf("%d",a[i]);
}
#include<stdio.h>
#define N 5//人数
void main()
{
int a[N]={0},i=0,out_n=0,call_n=0,*p;
p=a;
while(1){//循环报数
if(*p==0){//如果健在
if(out_n==(N-1))break;//如果仅剩一人
call_n++;//报数
call_n%=3;//最大为3,到了3就从0开始
if(call_n==0){*p=1;out_n++;}//为0(即3)出局
}
p++;if(p==a+N)p=a;//循环转向下一人
}
printf("最后剩余者的编号是:%d\n",p+1-a);
}
printf()函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。
函数的原型为:int printf(const char*format,...);函数返回值为整型。若成功则返回输出的字符数,输出出错则返回负值。
printf()函数的调用格式为:
printf("<;格式化字符串>",<参量表>);
其中格式化字符串包括两部分内容:一部分是正常字符;这些字符将按原样输出;另一部分是格式化规定字符,以"%"开始,后跟一个或几个规定字符,用来确定输出内容格式。
参量表是需要输出的一系列参数,其个数必须与格式化字符串所说明的输出参数个数一样多,各参数之间用","分开,且顺序一一对应,否则将会出现意想不到的错误。
规定符
%d十进制有符号整数
%u十进制无符号整数
%f浮点数
%s字符串
%c单个字符
%p指针的值
%e指数形式的浮点数
%x,%X无符号以十六进制表示的整数
%o无符号以八进制表示的整数
%g把输出的值按照%e或者%f类型中输出长度较小的方式输出
%p输出地址符
%lu 32位无符号整数
%llu 64位无符号整数
三个///后面的是我给你的注释。不明白续问。
...顺序排号。从第一个人开始报数(从1到3报 数),凡报到3的人退出圈子...
call_n++;\/\/报数 call_n%=3;\/\/最大为3,到了3就从0开始 if(call_n==0){*p=1;out_n++;}\/\/为0(即3)出局 } p++;if(p==a+N)p=a;\/\/循环转向下一人 } printf("最后剩余者的编号是:%d\\n",p+1-a);}
...顺序排号。从第一个人开始报数(从1到3报 数),凡报到3的人退出圈子...
{ printf("最后留下的人是%d号.\\n", i+1);break;} } }
...顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出...
n个人围成一圈,按顺序编号,分别为1、2、3..n。(你可以理解成每个人的座号)。然后1号开始,每人依次报号。即 (这里假设n=5)(前面是座号、后面是他报的号)1:1 2:2 3:3(退出)现在只剩下座号为1、2、4、5的人,从3的下一个开始报号 4:1 5:2 1:3(退出)2:1 4:2 5:3...
...从第一个人开始报数(从1到3报数),凡报到3的人退出圈子。
设有n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数 (用数学方法解的时候需要注意应当从0开始编号,因为取余会取到0解。)实质是一个递推,n个人中最终留下来的序号与n-1个人中留下来的人的序号有一个递推关系式。假设除去第k个人,则 0, 1, 2, 3...
有n个人围城一圈,顺序排号。从第一个人开始报数(从1报到3),凡报到3...
p=num; \/\/p之指向数组num的起始 for(i=0;i<n;i++) \/\/此处的for循环是给这n个人编号:第一个是1,第二个是2,……而且,仍然保持p指向数组num的起始处 (p+i)=i+1;i=0;k=0;m=0;while(m<n-1) \/\/此处的while循环是挑选报3的人退出圈子 { if(*(p+i)!=0) k++; ...
...顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出 圈 ...
if(*(p+i)!=0) k++;就是实现了,那些没有被淘汰的人(数组的对应元素值不为0)围成一个圈。但是,虽然被淘汰的人不再参与围成一个圈,但是,每次都要逐一判断这n人是否被淘汰,i就是用来记这个数的。所以,每次的圈子,表面上是由没有被淘汰的人围起来的,但是逐一进行了判断。希望对你...
...从第1个人开始报数(从1到3),凡报到3的人退出圈子,问最后留
define N 4 int main(void){ int a[N];int num = 1;int count = 0;for(int i = 0; i < N; ++i, ++num){ if(num == 4){ num = 1;} if(num == 3){ ++count;} a[i] = num;} while(count != N-1){ count = 0;for(i = 0; i < N; ++i){ if(a[i] =...
数据结构中的约瑟夫环问题用C语言怎么编写出来啊?
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出 圈子,问最后留下的是原来第几号的那位。1. 程序分析:这是一个比较经典的算法--约瑟夫环问题.2.个人分析: 算法比较经典,对于这样的问题本应该使用链表的形式会比较容易.约瑟夫环算法 则体现了使用数组来...
...有n个人围成一圈,顺序排号,从第一个人开始(从1-
char student[N];\/\/N个人,1表示未退出,0表示已经退出 int out[N];\/\/退出的人的号码记录 int count = -1;\/\/循环计数 0,1,2 <=> 1-3 int num_out = -1;\/\/退出号码记录的数组的下标 memset(student, 1, sizeof(student));\/\/将所有人状态置为1(未退出)for (int i = 0; i...
...从第一个人开始报数(从1~3报数)凡报到3的人退出圈子
代码有错,横线上填什么都不会过编译。把if(p>(___)改成if(p>(___))或if(p>___)的话,依次填:a+1、N、a+N、*p!=0或*p、i-3或3-i、 a[i]或a[i]!=0就能达到目的。第二个for循环中的j变量显然是多余的!