PTA 7-28猴子选大王(C语言实现)

[题目描述]

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

[输入格式]

输入在一行中给一个正整数N(≤1000)。

[输出格式]

在一行中输出当选猴王的编号。

输入样例:

11

输出样例:

7

解题思路 :

对于猴子选大王这道题,每次从1数到3,喊到数字3的猴子退出圈子,直到最后只有一只猴子为止。我的初步想法是用一个数组来解决问题,由于数组是从0开始,而我们这道题的猴子是从1编号,所以我在数组下标为0的位置放置0,这样数组下标为1的位置放置1,以此类推。可以用一个变量cnt来表示数组中元素为0的个数,当cnt小于猴子的总数时一直进行如下循环:使用变量i记录数组下标,我们希望i所对应的元素非0,同时注意i的值不能大于猴子总数;使用变量j记录从1数到3,当j大于3时置j为1,当j为3时,将数组下标为i的元素置为0,同时cnt加1。最后输出数组中的非0元素即为我们想要的结果。
还可以使用约瑟夫环一种数学方法,不过我还没有搞明白o(╥﹏╥)o

C语言代码如下:
#include 
int main(void){
  int n,i,a[1000],cnt,j,k;scanf("%d",&n);
  for(i=0;i<=n;i++){a[i]=i;}
  cnt=1;i=0;j=1;while(a[i]==0){i++;if(i>n)i=0;}
  while(cnt<n){
    if(j==3){a[i]=0;cnt++;}
    j++;if(j>3)j=1;
    i++;if(i>n)i=0;
    while(a[i]==0){i++;if(i>n)i=0;}}
  for(k=0;k<=n;k++){if(a[k])printf("%d",a[k]);}
  return 0;}

你可能感兴趣的:(c语言)