题目要求:
分析:
①报数是k的倍数或者末位数是k则淘汰
②剩最后一位则直接输出
③每一位的报数都是后面报数+1
思路:
1.创建一个数组,数组下标做编号,数组元素为报数,但数组下标是从0开始,而编号是从1开始,所以最后输出数组下标需要+1
2.将第一轮所有报数都放进数组元素中
3.while一直循环,直到剩最后一位则跳出
4.在while中:
①将满足报数是k的倍数或者末位数是k的设置为0,表示淘汰,淘汰人数+1,最后输出大于0的数组元素即可。
②判断是否剩最后一位,如果是则跳出while循环
③如果不是则没有淘汰中继续增加报数数量
④跳出循环后输出数组下标+1(编号)
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //小朋友的个数
int k = sc.nextInt(); //k为倍数或最后的个位数
int check = 0; //淘汰人数
int num =1; //数组元素初始值
//数组下标表示有n位小朋友,注意数组从0开始,所以最后输出数组下标应该+1
int [] game = new int[n];
//数组下标是小朋友的编号,数组元素是报数
for(int i=0;i<n;i++){
game[i] =num++;
}
while(true){
//判断报数是否为k的倍数或者末位数是k,如果是的话,就将该报数(数组元素)重置为0,check增加相当于淘汰人数增加
for(int i =0;i<n;i++){
if(game[i] !=0 && (game[i]%k ==0 || game[i]%10 ==k )){
game[i] = 0;
check++;
}
}
//判断淘汰人数是否与总的小朋友相差一位,是的话结束循环
if(check == n-1){
break;
}
//判断不是相差一位则继续增加报数
for(int i=0;i<n;i++){
if(game[i] !=0){
game[i] = num++;
}
}
}
//输出数组下标+1相当于小朋友编号
for(int i=0;i<n;i++){
if(game[i] !=0){
System.out.println(i+1);
}
}
}
}
因为循环用多次,所有运行时间超时了,只有90,这里只是提供用数组做的思路,简单应该要使用队列,栈之类的。
转载需声明...后续继续更新用Java实现ccf例题