原题链接:[编程入门]报数问题
解题思路:
1、使用数组模拟
2、默认数组值全为1,代表没有被点到。当被点到时,将其值设为0 。
3、使用一个for循环来完成上述逻辑。在此过程中记录被点到的人数,当只剩一个人没有被点到的时候结束。
注意事项:
参考代码:
#include<stdio.h>
#include<malloc.h>
int main()
{
int i, *a; //*a 模拟人
int n = 0; //人数
int m = 0; //记录当前报数
int k = 0; //被点到的人数
scanf("%d", &n);
a = (int *)malloc(sizeof(int)*n);
for(i = 0; i < n; i++)
{
a[i] = 1; //默认没被点到的为 1
}
for(i=0; i<n; i++)
{
if(a[i] != 0) //点到的为 0, 不为 0, 说明还没有被点到
m++;
if(m == 3)
{
m = 0; //重新从 0 开始报数
k++; //退出的人数 +1
a[i] = 0; //点到后记录为 0
}
if(i == n-1) //报数到最后一个人,从头再开始
i = -1; //此处 i = -1 后,在 for 里面 +1 后为 0
if(k == n-1) //如果退出的人比总人数少一个, 那么说明结束了
break;
}
//没有被置为 0 就是最终胜利的人
for(i=0; i<n; i++)
{
if(a[i] == 1)
{
printf("%d\n", i+1);
break;
}
}
free(a);
return 0;
}0.0分
23 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#include<stdio.h> int main() { int i,n,k=0,m=0,a[1000]; scanf("%d",&n); for(i=0;i<n;i++) a[i]=i+1; for(i=0;i<n;i++) { if(a[i]!=0) m++; if(m==3) { m=0; k++; a[i]=0; } if(i==n-1) i=-1; if(k==n-1) break; } for(i=0;i<n;i++) { if(a[i]!=0) printf("%d\n",a[i]); } return 0; }#include<stdio.h> int main() { int a,c=1,n=0,q; scanf("%d",&a); int p=a; int b[a]; for(int y=0;y<a;y++) b[y]=y+1; while(1) { while(b[n]==0 && n<a) { if(n==a-1) n=-1; n++; } if(c%3==0) { p-=1; if(p==0) break; b[n]=0; c=0; } if(n==a-1) n=-1; c++; n++; } printf("%d ",b[n]); }#include<stdio.h> #include<malloc.h> int main() { int n ; scanf("%d",&n); int *pn ; pn = (int *)malloc(n*sizeof(int)); int i ; for( i = 0 ; i < n ; i ++) { *pn = i + 1 ;//多少个人,各自分配编号 pn ++ ; } pn = pn - n ;//指针返回到第一个人那里 int non_zero = n ; int c3c = 1 ;//报数从1开始 while(non_zero > 1 )//如果还超过1个人,继续玩,剩下最后一个人,游戏结束 { for( i = 0 ; i < n ; i ++)//每次都是从头来一轮 { if( *pn != 0)//非0,这个人还没有退出,那么就是参与到游戏中 { if(c3c == 3 )//如果这个人的编号是3,那么这个人退出游戏 {int num[100] = { 0 }; int n,count,t=3,x=3,count1; scanf_s("%d", &n); count1 = n; for (count = 1; count <=n; count++) { num[count] = count; } while (count1!=2) { while (num[x]) { if (num[x] != 3) { t++; } if (t % 3 == 0&&num[x]!=3) { num[x] = 3; count1--; } x++; } x = 1; } for (count = 1; count < n; count++) { if (num[count] != 3) { printf("%d", count); } }一模一样的代码,为什么我的输出是1? #include<stdio.h> #include<malloc.h> int main() {int i,*a; int n=0; int m=0; int k=0; scanf("%d",&n); a=(int *)malloc(sizeof(int)*n); for(i=0;i<n;i++) a[i]=1; for(i=0;i<n;i++) {if(a[i]!=0) m++; if(m==3) {m=0; k++; a[i]==0; } if(i==n-1) i=-1; if(k==n-1) break; } for(i=0;i<n;i++) if(a[i]==1) {printf("%d\n",i+1); break; } free(a); return 0; }