C语言有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报 数)凡报到3的人退出圈子麻烦注释下代码
{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位无符号整数
{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) //报到3
{a[i]=0; //此人出圈
quit_num++; //出圈人数加1
k=0; //新一轮报数开始
}
i++; //移到下一个位置
if(i==n)i=0; //若超出范围,重回头上
} //此循环结束时,已有n-1人退出圈子
for(i=0;i<n;i++) //找到未出圈的人
if(a[i]!=0)printf("%d",a[i]); //如未出圈,就输出此人编号
}
int main(void){
int a[100],i,quit_num,k,n;///a存放n个人的编号
printf("input number:");
scanf("%d",&n);///输入人数n
for(i=0;i<n;i++)/*数组a存放原始编号*/
a[i]=i+1;
quit_num=0;/*出圈人数*/
i=0;///访问a数组的下标变量,即位置变量
k=0;///作为3次计数的变量
while(quit_num<n-1){/*直到只剩下1人时*/
if(a[i]!=0)///不等于0的是该数的,等于0的已经退出
k++;///数到1个不为0的就给3次计数变量k增1
if(k==3){///若k==3了,这个人就该退出了
a[i]=0;///用0标记这个人(下标为i的)退出
quit_num++;///退出了1人,就给退出人数记录变量quit_num增1
k=0;///退出1人时将3次记数变量k清0,为下次记数作准备
}
i++;///每考察1个位子,无论是否有人都得将位子向后移1位
if(i==n)///若已把位子移到最后1人的后面了则将其归0,重新从头记数
i=0;
}
for(i=0;i<n;i++)///考察整个数组
if(a[i]!=0)///把数组中不为0的那个数打出来——他就是最后剩下的人的编号。
printf("%d",a[i]);
return 0;
}
三个///后面的是我给你的注释。不明白续问。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int *s;
int i,m=3,n,count,mm;
printf("请输入n的值:");
scanf("%d",&n);
s=(int*)malloc(sizeof(int)*n);
for(i=0;i<n;i++) //n个人,对应数组中的值为0则表示已出列
{
s[i]=1; //初始,全部未出列
}
printf("\n退席的人编号为: ");
i=0;
count=0; //出列人数---计数
mm=1; //从1开始数
while(count<n) //当出列人数小于总人数时循环
{
if(s[i]==1)
{
if(mm==m) //当数到3个人时出列
{
printf("%d ",i+1);
mm=1; //重新从1开始数
count++; //出列人数加1
s[i]=0; //数组中标记该人已出列
}
else
{
mm++;
}
}
i++;
if(i>=n) //当数组下标大于总人数时,从0开始,也就是数组尾接上数组头
{
i=0;
}
}
return 0;
}
第二轮:3的倍数加1(共33个)去掉,还剩34个
第三轮:3的倍数加2(共32个)去掉,还剩2个
不好意思,最后必定剩下2个,且最后留下来的是1号和2号(从3开始一直到100不是满足3的倍数就是满足3的倍数加1就是满足3的倍数加2,所以全部被去除)