【报数游戏】

题目描述

100个人围成一圈,每个人有一个编码,编号从1开始到100。

他们从1开始依次报数,报到为M的人自动退出圈圈,然后下一个人接着从1开始报数,直到剩余的人数小于M。

请问最后剩余的人在原先的编号为多少?

输入描述

输入一个整数参数 M

输出描述

如果输入参数M小于等于1或者大于等于100,输出“ERROR!”;

否则按照原先的编号从小到大的顺序,以英文逗号分割输出编号字符串

示例1

输入

3
  • 1

输出

58,91
  • 1

说明

示例2

输入

4
  • 1

输出

34,45,97
  • 1

说明

解题思路

题目描述的是一个经典的约瑟夫环(Josephus)问题的变种。题目要求在100个人围成一圈的情况下,进行报数,每次报到数字为M的那个人自动退出,直到剩下的人数少于M为止。我们需要找出最后剩下的人的编号。

详细步骤
  1. 初始状态:有100个人,编号从1到100。
  2. 报数规则
    • 每个人从1开始依次报数,每当某个人报到M时,该人退出圈子,剩下的人继续报数。
    • 报数是连续进行的,即如果当前报数人退出,接下来的人从1重新开始报数。
  3. 停止条件:当剩余人数小于M时,停止报数,输出剩余人的编号。
  4. 输入限制
    • 如果输入的M不符合1 < M < 100的条件,输出"ERROR!"。
  5. 输出:当程序结束时,按原先编号从小到大的顺序,输出剩余的人的编号,多个编号之间以英文逗号分隔。

C语言代码

#define  _CRT_SECURE_NO_WARNINGS 1
#include
#include"stdlib.h"
#include"string.h"

int* find_last_person(int* number, int size, int M, int* result_size) {
    while (size >= M) {
        int* temp = (int*)malloc(sizeof(int) * size);
        int temp_size = 0;
        for (int i = M; i < size; i++) {
            temp[temp_size++] = number[i];
        }
        for (int i = 0; i < M-1; i++) {
            temp[temp_size++] = number[i];
        }
        free(number);
        number = temp;
        size = temp_size;
    }
    *result_size = size;
    return number;
}

int cmpfunc(const void* a, const void* b) {
    int int_a = *(int*)a;
    int int_b = *(int*)b;

    if (int_a < int_b) {
        return -1;
    }
    else if (int_a > int_b) {
        return 1;
    }
    else {
        return 0;
    }
}

int main(){
    int M;
    scanf("%d", &M);
    if (M <= 1 && M >= 100) {
        printf("ERROR\n");
    }
    else {
        int* number = (int*)malloc(sizeof(int) * 100);
        for (int i = 0; i < 100; i++) {
            number[i] = i + 1;
        }
        int result_size;
        int* result = find_last_person(number, 100, M, &result_size);
        //int* result = find_last_person( 100, M, &result_size);
        qsort(result, result_size, sizeof(int), cmpfunc);
        for (int i = 0; i < result_size; i++) {
            printf("%d", result[i]);
            if (i != result_size - 1)  
                printf(",");
        }
        printf("\n");
        free(result);
    }
    return 0;
}

你可能感兴趣的:(华为OD刷题,敲代码系列,算法)