PTA C语言循环题报数

今天是我第一次在这里写博客,其目的主要是写写自己的收获!其次是给遇到编程题困难的小伙伴一些参考!(因为我经常遇到困难一般百度,在这里要感谢大佬们,帮我解决了很多棘手的问题!)

今天主要是分享PTA程序设计类实验的浙大版《C语言程序设计(第3版)》题目集里的习题8-4 报数 (20分)这道题,一开始我傻眼啦!不明白out数组是怎么出来的。

在这里讲一下思路,首先n个人且每个人的编号是从1~n的,然后开始从1报数,报道m的时候m退出,这是题目大致的意思。我依照给的例子来做讲解,假设n=11,m=3,第一次3号人==3,3号人退出,那么又第i个位置上的人是第out[i-1]个退出的*。这句话好好理解一下,也就是说3号人是第一个出来的,接着4号人又从1开始报数直到报道数字3,第二轮是6号人出去,依次来第三轮是9号人出去。***所以第i个位置上的人是第out[i-1]个退出的***在看这句话,也就是说out[3-1]=out[2]=1,out[6-1]=out[5]=2,out[8]=3,依次类推…out[0]=4,out[4]=5…

好啦!题目理清楚啦,如何写代码,首先一个问题是如何进行循环,学过C语言链表的同学是否第一下想到循环链表,但是这是C语言题目,循环链表属于数据结构,未必有点小题大做啦!下面是我写的代码,完整代码如下:

#include <stdio.h>
#define MAXN 20

void CountOff( int n, int m, int out[] );

int main()
{
    int out[MAXN], n, m;
    int i;

    scanf("%d %d", &n, &m);
    CountOff( n, m, out );
    for ( i = 0; i < n; i++ )
        printf("%d ", out[i]);
    printf("\n");

    return 0;
}
void CountOff( int n, int m, int out[] )
{
    int i=1,t=0,k=0;
    int sum=n;
    int a[n];
    for(i=1;i<=n;i++)
        a[i]=i;//方便后面置让a[i]=0
    while(sum)//控制循环,不到最后一个人不会停止循环
    {
        for(i=1;i<=n;i++)
        {
            if(a[i]==0)
            {
                continue;//当循环到第二轮的时候遇到第一轮的a[i]=0,进行跳出本次循环
            }
            ++k;//用来做标记的
            if(k==m)
            {
                ++t;
                out[i-1]=t;//t是用来记录第几个跳出的
                a[i]=0;
                k=0;//切记要在此使k=0,从1到m
                sum--;//控制while直到最后一个人
            }
        }
    }
}

在这里插入图片描述

我相信初学C语言的你一定看的懂,我也是刚学完C语言不久。或许看到此篇文章的你正在学C语言。欢迎大家互相交流,大家共同进步,当然有什么C语言相关问题也可以找我qq:1483625835!

此代码函数部分虽然定义的变量较多,但是实现的功能通俗易懂,很好理解!适合小白,大佬勿喷!

©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页