一群人1-3循环报数 报到3的退出 到最后留下的是几号
1.用数组做,数组地址与对应值不变,用另外两个变量对数到3的进行判定;
#include<stdio.h>
int main()
{
int a[100]; int i,n,p=0,q;
printf("input number:");
scanf("%d",&n);
q=n;
for(i=0;i<n;i++) a[i]=i+1;
for(i=0;;i++)
{
if(i==n)
i=0; //当i++到n时,肯定有一些没有被选到,如我们输入8,第一轮3,6被赋值0,当i=8时,继续下一轮//
if(a[i]!=0) p++; //我们下面定义的是当循环到三时,就赋值0,所以这边等0的不考虑在内//
else continue;
if(p%3==0) //这个就是从0一直加,到三的倍数就赋值为0,从而就达到我们的目的//
{a[i]=0;q--;} //上面q=n;表明q==n,只有一个为0就减一,为下面做铺垫//
if(q==1) break; //当剩下最后一个就输出//
}
for(i=0;i<n;i++)
if(a[i]!=0)
printf("spare: %d\n\n",a[i]);
}
2.用指针的方法,思路同用数组的一样,不过这个个人感觉相对优化了;
1 #include<stdio.h>
2
3 int main()
4 {
5 int num[100];
6 int i,j,k,m,n;
7 int *p;
8
9 printf("Please input number:\n");
10 scanf("%d",&n);
11
12 p=num;
13 for(i=0;i<n;i++)
14 *(p+i)=i+1; //以1至n为序,给每个人编号
15 i=0; //i为每次循环时计数变量
16 k=0; //k为按1 2 3报数时的计数变量
17 m=0; //m为退出人数
18 while(m<n-1) //当退出人数比n-1少时(即未退出人数大于1时)执行循环体
19 {
20 if(*(p+i)!=0)
21 {
22 k++;
23 }
24 if(k==3) //将退出人的编号置为0
25 {
26 *(p+i)=0;
27 k=0;
28 m++;
29 }
30 i++;
31 if(i==n)
32 {
33 i=0; //报数到尾后i恢复为0
34 }
35 }
36
37 while(0==*p)
38 {
39 p++;
40 }
41 printf("最后一个是%d号!\n",*p);
42 return 0;
43 }
3.这个方法一般想不到;emmmmm
#include <stdio.h>
int M = 3;
int main()
{
int n, i, s = 0;
scanf("%d", &n);
for (i = 2; i <= n; ++i)
s = (s+M)%i;
printf("%d\n", s+1);
return 0;
}