今天是我第一次在这里写博客,其目的主要是写写自己的收获!其次是给遇到编程题困难的小伙伴一些参考!(因为我经常遇到困难一般百度,在这里要感谢大佬们,帮我解决了很多棘手的问题!)
今天主要是分享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!
此代码函数部分虽然定义的变量较多,但是实现的功能通俗易懂,很好理解!适合小白,大佬勿喷!