c语言的指针和数组报数问题

C语言的指针和数组可以用来解决一些算法问题,比如著名的报数问题。报数问题可以描述为:有n个人围成一圈,从第一个人开始报数,报到m的人出圈,接着从下一个人开始重新报数,直到所有人都出圈为止。假设n个人的编号分别为1到n,出圈的顺序是按照出圈的编号从小到大排序的。

使用指针和数组可以比较方便地解决这个问题。

具体来说,可以使用一个指针指向当前报数的人,使用一个数组记录每个人是否出圈,直到所有人都出圈为止。

下面是一个示例代码:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int n, m, i, j;
    printf("Enter the number of people: ");
    scanf("%d", &n);
    printf("Enter the count number: ");
    scanf("%d", &m);
    int *arr = (int *) malloc(n * sizeof(int)); // 动态分配n个int类型的空间
    if (arr == NULL)
    {
        printf("Memory allocation failed\n");
        exit(1);
    }
    for (i = 0; i < n; i++)
    {
        arr[i] = 1; // 初始化数组,1表示未出圈,0表示已出圈
    }
    int *ptr = arr; // 定义指针指向当前报数的人
    int count = 0; // 记录已出圈的人数
    while (count < n)
    {
        for (i = 0; i < m - 1; i++)
        {
            while (*ptr == 0) // 跳过已出圈的人
            {
                ptr++;
                if (ptr == arr + n) // 判断是否越界
                {
                    ptr = arr;
                }
            }
            ptr++; // 指向下一个人
            if (ptr == arr + n) // 判断是否越界
            {
                ptr = arr;
            }
        }
        while (*ptr == 0) // 跳过已出圈的人
        {
            ptr++;
            if (ptr == arr + n) // 判断是否越界
            {
                ptr = arr;
            }
        }
        printf("%d ", ptr - arr + 1); // 输出出圈的人的编号
        *ptr = 0; // 标记为已出圈
        count++;
        ptr++;
        if (ptr == arr + n) // 判断是否越界
        {
            ptr = arr;
        }
    }
    free(arr);
    return 0;
}

在上面的代码中,首先从用户输入中读取人数n和报数m,然后使用malloc()函数动态分配n个int类型的空间。接着,使用一个数组arr记录每个人是否出圈,1表示未出圈,0表示已出圈。使用一个指针ptr指向当前报数的人,使用一个计数器count记录已出圈的人数。在while循环中,每次循环报数数m次,然后输出出圈的人的编号,标记为已出圈,并将指针指向下一个人。循环直到所有人都出圈为止。最后使用free()函数释放动态分配的内存。

需要注意的是,在循环中需要判断指针是否越界,即是否指向了数组的最后一个元素。如果指针越界,需要将其重新指向数组的第一个元素。

c语言指针和数组的区别

C语言实现数组去重的基本思路