2025-02-23 学习记录--C/C++-PTA 7-28 猴子选大王
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻
一、题目描述 ⭐️
二、代码(C语言)⭐️
#include <stdio.h>int main() {int n;int currentMonkeyIndex = 0; // 当前猴子的指针索引值。默认从0开始int currentMonkeySaying = 1; // 当前猴子的报数:范围是1~3,若为3,则被踢出。默认从1开始int outTotal = 0; // 被踢出的猴子总数。默认从0开始scanf("%d",&n);int arr[n]; // 数组:存放猴子编号for(int i = 0; i < n; i++) {// 将猴子编号放入数组中,从1开始arr[i] = i + 1;}// 当被踢出的猴子总数 等于 n-1 时(即 只剩一个猴子未被踢出时),才停止while循环。while(outTotal < n - 1) {// 如果当前猴子的编号不为0,则报数:默认是1,范围是1~3,若为3,则被踢出。if(arr[currentMonkeyIndex] != 0) {// 若当前猴子的报数为3,则被踢出,即 将其编号置为0if(currentMonkeySaying == 3) {// 将该猴子编号置为0arr[currentMonkeyIndex] = 0;// 下一个猴子报数为1currentMonkeySaying = 1;// 被踢出的猴子总数加1outTotal++;} else {// 报数,然后 加1 给下一个猴子用currentMonkeySaying++;}}/** 当前猴子已处理完毕 */// 指针指向下一位,索引值右移一位currentMonkeyIndex++;// 如果指针(从0开始)指向数组的最后一位,则回到起始点if(currentMonkeyIndex == n) {currentMonkeyIndex = 0;}}// 找到数组中编号不为0的唯一猴子,输出其编号for(int i = 0; i < n; i++) {if(arr[i] != 0) {printf("%d",arr[i]);// 找到就退出for循环,减少时间复杂度break;}}return 0;
}