故事的开头总是极尽温柔,故事会一直温柔……
✨你好啊,我是“ 怪& ”,是一名在校大学生哦。
主页链接:怪&的个人博客主页
☀️博文主更方向为:课程学习知识、作业题解、期末备考。随着专业的深入会越来越广哦…一起期待。
❤️一个“不想让我曾没有做好的也成为你的遗憾”的博主。
很高兴与你相遇,一起加油!
一、代码如下:
#include
using namespace std;
#define N 1002//小朋友最多1000个
int k;
int isK(int x){//满足 “若一个小朋友报的数为k的倍数或其末位数(即数的个位)为k ”则返回1
if((x%k==0)||(x%10==k)) return 1;
else return 0;
}
int main(){
int n;
cin>>n>>k;//n:小朋友个数 k:若一个小朋友报的数为k的倍数或其末位数(即数的个位)为k,则该小朋友被淘汰出局
int Sum=n;//小朋友剩余Sum个
int flag[N];//
for(int i=1;i<=n;i++){//flag[i]==0,小朋友已出局;flag[i]初始值为1
flag[i]=1;
}
int num=1;//报的数
int ChildFlag=1;//第ChildFlag小朋友报数
while(Sum>1){//剩余小朋友数Sum>1,一直执行,Sum
while(flag[ChildFlag]==0){//跳过已出局的小朋友(即将ChildFlag移到第一个遇到仍未出局的小朋友处)
if(ChildFlag==n){ChildFlag=0;}//穷尽小朋友时,应回到第一个小朋友,末尾执行+1,所以此处赋值为0
ChildFlag++;
}
if(isK(num)==1 && flag[ChildFlag]==1){//此数满足条件,且轮到的未出局小朋友
flag[ChildFlag]=0;//出局
//cout<<"淘汰了第"<
二、解题思路:
1、设置int flag[n]数组,flag【 ChildFlag】记录轮至第ChildFlag个小朋友报数,若flag[ChildFlag]==1,则该小朋友未出局。值为0,则该小朋友已出局。
2、int isK(int x);判断输入的数x是否满足条件,满足则返回1,否则返回0;
3、while(Sum>1):剩余小朋友数>=2,则一直执行。
(1),第一个while作用:跳过已淘汰的小朋友。因为通过ChildFlag来存储轮至第i个小朋友报数,应先判断flag【ChildFlag】是否等于0,即是否淘汰,通过while()语句跳过连续的已淘汰的小朋友。
(2),第ChildFlag报的数num满足条件,则执行相应内容。
(3),第ChildFlag报 的数num不满足条件,则执行相应内容。
4、关键:ChildFlag至n+1时,将ChildFlag赋值为1。结合实例:小朋友报数一轮后,重新由第一个小朋友报数。(函数中有while语句跳过已出局的小朋友)
三、题目如下: