题目大意:
本题大意是一堆小朋友玩酒桌游戏:所有人围一圈,编号1~n,从其中某个编号为a的小朋友开始说出一个合数b(非质数但不包括1,最小的合数为4),其中编号为m的小明比较
聪明。他想着,从b开始数,每次说完都加1,如果加1后为质数则此人敲桌子一下(duang),并且循环方向发生改变。直至轮到他自己,并输出小明应该Duang还是说出这个合
数。
我的思路:
在我看来,这道题有两点应该注意,第一:判断质数;第二:循环方向的改变。
源码:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
//此函数用于判断质数
bool isSushu(int value){
if(value == 1){
return false;
}
int a = sqrt(value);
for(int i = 2;i<=a;i++){
if(value % i == 0){
return false;
}
}
return true;
}
int main()
{
int t;
int n,m;
int a,b;
cin>>t;
while(t-- != 0){
cin>>n>>m; //n代表总共人数 m代表小明的序号
cin>>a>>b; //a代表开始人的序号,b代表他所说的数字
bool f = false; //小明已经说过则为true,否则为false
int result = b;
int flag = 1; //用作循环方向的标记 ,默认正向循环
while(!f){ //只要还没有轮到小明就一直循环下去......
if(a == (n+1)){ //如果轮了一圈了则返回到第一个人
a = 1;
}
if(isSushu(result)){ //碰到质数,循环方向发生改变
flag = -flag;
}
if(a == m){ //判断是否轮到小明
if(isSushu(result)){ //轮到小明时是否为素数
cout<<"duang"<<endl;
}else{
cout<<result<<endl;
}
f = true;
}
if(flag == -1){ //反向循环
a--;
}else{ //正向循环
a++;
}
result ++; //要判断的数要持续加 1
}
}
}