故事的开头总是极尽温柔,故事会一直温柔……💜
✨你好啊,我是“ 怪& ”,是一名在校大学生哦。
🌍主页链接:怪&的个人博客主页
☀️博文主更方向为:课程学习知识、作业题解、期末备考。随着专业的深入会越来越广哦…一起期待。
❤️一个“不想让我曾没有做好的也成为你的遗憾”的博主。
💪很高兴与你相遇,一起加油!
一、代码如下:
#include <iostream> 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<<"淘汰了第"<<ChildFlag<<"小朋友"<<endl; Sum--;//满足条件,淘汰一个小朋友 num++;//报数+1 ChildFlag++;//轮至下一个小朋友 if(ChildFlag==n+1){ChildFlag=1;} //穷尽小朋友时,重新轮到第一个小朋友 } else if(isK(num)==0 && flag[ChildFlag]==1){ //cout<<"没有淘汰"<<endl; ChildFlag++;//轮至下一个小朋友 num++;//报数+1 if(ChildFlag==n+1){ChildFlag=1;} //穷尽小朋友时,重新轮到第一个小朋友 } } for(int i=1;i<n+1;i++){ if(flag[i]==1)cout<<i<<endl;//此时仅仅有一个小朋友未出局,其flag【i】==1 } return 0; }
二、解题思路:
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语句跳过已出局的小朋友)
三、题目如下:
编辑