题目分析
一圈人说的就是一个循环抽象来说就是一圈循环要T了多少个成员,不妨把T掉的人变为0这样最后输出不为0的
即可
代码
#include<stdio.h> main() { int i,a[100],j,k=0;//定义人员数量 int quit=0;//退出人数 scanf("%d",&i);//参与人数 for(j=0;j<=i;j++)//给成员编号 { a[j]=j; } j=0; while(quit<i-1)//剩最后一个人时退出 { if(a[j]!=0)k++;//过滤退出的玩家,剩下的玩家喊口号 if(k==3){a[j]=0,quit++;k=0;}//当有玩家喊道3时退出 j++;//下一个人 if(j==i)j=0;//检测一圈是否结束 } for(j=0;j<i;j++)//筛选出在场的玩家 { if(a[j]!=0){printf("%d",a[j]);} } }
ps 这是基础运用和一些逻辑的混合 对于入门的人来说有点挑战 但是 没挑战也没啥意思。。。。。。。。。。。。。。
0.0分
0 人评分
#include<stdio.h> main() { int i,a[100],j,k=0; int quit=0; scanf("%d",&i); for(j=0;j<i;j++) { a[j]=j+1; } j=0; while(quit<i-1) { if(a[j]!=0)k++; if(k==3){a[j]=0,quit++;k=0;} j++; if(j==i)j=0; } for(j=0;j<i;j++) { if(a[j]!=0){printf("%d",a[j]);} } } 稍微修改了一下 这个才是对的
# include <iostream> using namespace std; int main() { int i, s = 0; int M, N; cout << "input the number M and N:" << endl; cin >> M >> N; for (i = 2; i <= M; i++) { s = (s + N) % i; } cout << "the number is:" << s + 1 << endl; }//某种恐怖的东西,楼主的方法,在不是数3个人而是很多时,时间可能超限
tianbowen 2017-12-26 15:07:45 |
请问一下s=(s+N)%i 这个逻辑是怎么想出来的?
laolin2333 2018-01-06 17:05:31 |
说实在,我至今不是很懂这关键一步,只知道这个是正确的,好像可以在数学上证明。
saitama 2018-12-10 21:35:15 |
一般方法只能这样一次次循环去掉了
写得挺好, 建议把赋值改成a[j] = j; 这样人数才正确,
2005年春浙江省计算机等级考试二级C 编程题(3),复杂度最低的方法没有之一!!!!!浏览:856 |
C语言程序设计教程(第三版)课后习题1.5 (C++代码)浏览:778 |
拆分位数 (C语言代码)浏览:1361 |
Pascal三角 (C语言代码)格式错误浏览:551 |
C语言程序设计教程(第三版)课后习题7.5 (C语言代码)浏览:548 |
【计算直线的交点数】 (C语言代码)浏览:1501 |
字符逆序 (C语言代码)浏览:645 |
数字游戏 (C++代码)浏览:1240 |
Tom数 (C语言代码)浏览:581 |
C语言程序设计教程(第三版)课后习题10.3 (C语言代码)浏览:523 |