鱼C论坛

 找回密码
 立即注册
查看: 3795|回复: 4

猴子问题

[复制链接]
发表于 2011-10-2 03:45:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大家好!
/ y! N& O/ M" d; F8 L这几天我在忙着编一个问题,我用了一种方法编出来!
7 ^( X, ^- e- O3 d0 h6 c但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!( ]. z6 Z) A$ C
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
7 B& w9 A7 a3 Y; m, F+ ~; ~9 k0 v& z1 e
4 X8 n* ?  N+ [
                            题目
% w4 ]3 v0 u! Q" g. l山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。7 a/ R, I/ b1 m! k7 s
第一种方法:利用循环链表
3 v9 R; _  G8 M6 @: j8 p) Y" i9 _#include<stdio.h>
! {9 d8 W& `% \& D" n#include<malloc.h>1 Y3 t1 u0 M1 a& V0 I" F
#define M 8            //共有8只猴子9 \. A1 d  f" ?
#define N 3            //数到3只时退出第三只' T4 ?2 s0 t) K  L
typedef struct monkey7 L2 k2 s* x! h  C- q
{int number;) M& N! ?4 ?/ O5 l% z
int flag;4 l, j3 b6 k" V8 P
struct monkey* next;
+ R' `0 q( D  X0 y2 k}MONKEY;
' c3 o: q* ]" }# E! h; [main()
: \/ t/ `& U3 K% z' M% G{ MONKEY *head=NULL,*p,*s;
8 i/ m! i/ A* j" }& t$ p' q  int i,sum=0,count=0;) \) q9 e/ c# f5 T9 K. o' [
  clrscr();              //清屏
0 a$ X: {, o7 G5 z0 r. V  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存' F, H$ E0 ?" v* L
  p->number=1;p->flag=1;
4 X* F2 [: u6 O5 G) ^1 n  p->next=head;
" o7 R" R" b, n* f, Y  o$ ]  head=p;
! u& W* X/ N0 \& ?7 @6 {  for(i=2;i<=M;i++)
8 W8 T  M! J; F: F9 C$ H    { s=(MONKEY *)malloc(sizeof(MONKEY));
# S& Z7 M4 p2 y; m0 H* {     s->number=i;s->flag=1;& g" t3 m& K) I4 O* @0 q
     s->next=head;% ~) \$ @( s7 `1 w. J! C
     p->next=s;p=p->next;
, c! U0 D; b5 C2 E# x( R9 P    }( u3 H7 i/ N* X
    p=head;0 Z+ p- I; X+ h
   for(;;)
, i. i) o5 \; ?. q1 G$ N    {if(p->flag==1)
+ t. K8 W! d; [. u       count++;7 L# `% A6 ?: Q
     if(count==N)
9 `' S0 }* H  p        {p->flag=0;5 q' C" B& p5 p) `
         count=0;
  t; N" r4 A% |6 I+ F         sum++;}
) l  k9 d: V8 ~     if(sum==M-1): ]8 o5 w# ^4 g& s5 g; V
        break;& G  x9 A* f0 a! y" i! S: v+ v2 c
     p=p->next;
: |6 s( x" R% D0 G    }: n0 e' Z2 }+ a9 p0 L- S  G
    p=+ X  N1 g, N, i9 y, c; [: Q. E
    head;
& d6 y- D. b( G: ]- M  r, Y1 h    for(i=1;i<=M;i++)
5 @; X9 P1 Z0 ?$ E; Q+ a    { if(p->flag==1), |* {& r* j2 E6 ^% ^  w
        printf("\t%d",p->number);
- J4 v0 o2 i: y4 b      p=p->next;
: [3 U4 k9 K7 P+ c9 y% h    }
9 Y6 G" d) U+ A0 d4 s0 {; p; n* Q7 {. z1 d3 R9 \& F3 y* k* L
! q0 L: M+ O9 M/ T9 C- ~% c

' M+ K3 V' @' A% x8 ^, F- x}
8 `5 N# g/ U2 d9 p, C
第二种方法:数组
2 C6 Z! [6 ]: Z! [( w- M#include<stdio.h>; S% P5 x; Q" n& e" I, Z
#define M 82 L& q; G, o) K# v: K
struct monkey8 s) Y3 \5 I. ~0 g5 Q1 ]8 G
{int number;
1 }, m7 O6 _5 b% L3 a  tint nextp;
: s; ?. N2 r- L# k}link[M+1];
" ?0 \7 A' q3 d  v1 X
0 L: A2 A) K3 b" B0 Rvoid main()5 _" F: _( q! H4 v% Q* a
{int i,count,h;
8 e2 ?9 ^, A2 Q; Z& l# {for(i=1;i<=M;i++)
1 T; @7 `8 v; t; J: ^8 e{  if(i==M)9 {; }; R. R6 T! B
   link[i].nextp=1;
/ T! x6 I" g+ {, K5 A- Y; i# W, _   else
, C, b4 C; p; {! I* w   link[i].nextp=i+1;
5 q4 o- e5 ?/ s, G2 z* m$ s  link[i].number=i;
# ]3 z4 m5 N9 k) G2 h, j}1 y6 e" ~1 z1 d
printf("\n");, U7 A# a. T& ]" e! ?
count=0;& F: N3 h% U3 U- N$ a5 m
h=M;
' l6 N) z1 Z* k1 h% f1 Pprintf("依次退出的猴子: \n");$ q& V9 k3 g3 U, x- L# h
while(count<M-1)
* d6 X0 g! f* y: N+ f1 q+ ^2 u{i=0;. T- ?5 D% s) \1 Q2 [% T
while(i!=3)
8 [2 ~8 v7 C2 J$ K) N{ h=link[h].nextp;$ m% X! g; x/ e2 [
   if(link[h].number)
* Y' z3 A; ~! j- _     i++;}1 r5 p+ F! T5 f& q/ w. ?/ ~4 R

( B+ v! Z( ]7 f* ^  |3 hprintf("%4d",link[h].number);
, f2 ~- A4 Q2 E) Klink[h].number=0;2 S  F6 ~; D1 y+ k  ~1 H# X
count++;% t$ q0 d5 s$ r2 `) l
}
$ v2 y8 f3 ~$ F% H. E' m/ J3 K2 P2 X- h2 K
printf("\n大王是:");* r/ t2 @* `8 [1 t6 y2 ]( D. v
  for(i=1;i<=M;i++)
8 z* j; |% F& `* e( i  if(link[i].number)
  A/ o1 n. D+ ~- v3 `    printf("%3d\n",link[i].number);
4 K! b4 x& C! d* C) D, U7 ~) Q
& e9 {) Y' {1 f7 Q4 _
1 K/ y9 d% Y( R; P& e. U}
8 m$ q2 ^+ e0 p4 D% f$ W8 L
第三种是普通方法for循环
3 i% Z" Z  L4 \0 r" H
#include<stdio.h>, C  n; h% K# ^( n' d- @. h; x
void main()* Q* M# y  Z* V6 }( q
{ int i,k,m,n,num[50],q,*p;' l( B4 M. M8 |5 j, O3 Q, S4 r; S
    clrscr();! d7 @0 [+ ?! o9 k% c3 P
   printf("input number of person: n=");
* ]0 A. X7 F' K5 ^/ X6 Q    scanf("%d",&n);" `# ~& g. ?$ _% S4 z
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
1 S1 P+ ?3 p6 d( U; d+ n    scanf("%d",&q);
8 {4 a0 k# s5 G   p=num;, ~2 c4 @" Z; c0 N; [; Y
  for(i=0;i<n;i++)
6 @* u) q/ w( d9 j2 @    *(p+i)=i+1;
- E, N$ s0 A7 o% \   i=0;
- ~+ z4 }, j. m7 R' X  a   k=0;8 L- H% \; b) L
   m=0;
1 x0 O1 |8 m# v, i1 r  while(m<n-1)
* i2 G' w+ S0 h   {if(*(p+i)!=0) k++;
# y7 ^5 V; V; M1 F; @3 E! D     if(k==q)
5 {7 k$ @% k* y3 L      { *(p+i)=0;
6 T1 u. i9 ?% |        k=0;- I7 [3 F- U& w- N% B6 x
        m++;
# N2 d; O0 G+ f      }
  D! p" n  f$ r0 h. T. K    i++;4 p: v% q( y; z# b' L$ V- I
    if(i==n)i=0;3 |# ]& e1 o# A  V  F% {7 R6 W
   }4 ~: V6 t  H1 W8 _& q
  while(*p==0)p++;/ X3 c" j. k+ n/ J! H+ k
    printf("The last one is NO:%d\n",*p);
" {. h- b$ B3 O1 j5 `     getch();
! ]3 [. l# H, t2 i! a; i2 Y
5 s2 S. y) {5 r" Y' L: @( @+ t( d: k( Q}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;' o! {( r" J' d7 K) [& s, I
namespace 又费马达又费电/ w0 m, f! @$ v$ w
{% ?9 e- {3 q4 e) l8 W' S
    class Program0 ^- A/ Y! f1 z- B
    {+ F6 S: }0 C9 [
        static void Main(string[] args)+ `+ `4 Y. H: ~
        {
4 |& D8 _# N4 X' N1 R. S            int m, n;
& P' s# P0 X! L2 W            Console.WriteLine("请输入数组长度");! {$ u7 I) I2 k# S: @7 T6 P
            m = int.Parse(Console.ReadLine());//m为数组的大小4 ?* M( B( C. D4 f+ Z6 v. ~7 r
            Console.WriteLine("请输入要截取数字的大小");
  Y+ w5 J, l* b: T5 y            n = int.Parse(Console.ReadLine());
. {7 @$ r' u7 d- S6 O            int [] numw=new int
/ l: J7 n1 ^' p5 ?  O+ S4 e! d. s% N7 X9 E5 _7 _: E
&shy;&shy;&shy;;: O2 F; _5 g6 e0 j. o
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数$ j, n8 ^$ V, j
            {6 h" P# X' y" ^! W9 o
                numw[j - 1] = j;1 B0 e+ i9 x5 a! K9 P7 `
            }8 d4 ~- ]2 _  R
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!  E; n& a6 v1 W# z
            while (d != m - 1)# j, ~9 U% }" Q7 {  R8 e4 @
            {
) Z+ @4 Z" B7 _9 \7 r                if (i == m && d != m - 1)
' h0 T8 T2 [. M" F# o                {# E. R% W$ D$ z  D
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
: ?( T/ S' ~5 m                    continue;
( |5 l% ^- a* d2 M                }
; f+ J& \1 z. ^8 G$ L3 m# |! M; X0 I                else9 g* @+ o- p' o) L: Q  [& ~
                {
4 u! [" j" B3 E4 I& z                    if (numw[i] != 0)2 J* {7 t0 _5 _8 L! G& @& ?( I$ Y
                    {* t1 a, d+ r' t. D+ O5 D2 T. d
                        i++;/ l8 r: s; R: L) S! Z
                        k++;
( q9 ^- q* l! I4 e. Z* e! i                        if (k == n)
) x2 c7 w3 w0 J! N6 @( e( v                        {
' T# B. F: V" j. j: e! W                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
" F' H: |1 H. t1 H' K( @' t- G, _                            k = 0;* u- n% a" B+ I. v" U# D5 Q; E7 r
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
9 _$ i7 y, F% D" S  s$ b                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);1 `6 _$ h: M4 `3 S! B6 {0 c% I
                        }
) ~- r4 K$ w! q9 A                        else//输出暂时还没有改变数组元素的值  j* t3 e- h6 F1 W9 g; c% `) O4 V
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);6 [/ y2 Q& }5 ^
                    }
/ P6 C- Y/ [, U. {                    else6 ?6 W1 a) h% n, f9 Z; V/ @8 i
                        i++;//数组元素为0,直接跳过,不计数。。。
2 v/ T; C5 y1 ?" ]& k                }
9 F& V/ j: L( `0 N! @' ~! G) A 5 K. k7 `7 J! e* S, a! ~
6 s/ w% s9 ?9 Z# N9 T: W* }  c
            }//结束while循环
) l0 D2 M4 L2 m9 i1 |( b4 h- x            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦! W8 J! [! r9 ]: o# X) V' R
           
4 q7 |# x3 P% @+ N) H+ I8 k                if (numw[i] != 0)- E  T9 C4 p& A% |, ]
                    Console.WriteLine(numw[i]);
. L" r  T" G  V7 R1 {           
+ F6 H4 i- ~3 y6 {  y4 O8 v# t            Console.ReadLine();' L" j: h/ s; {9 Q$ r& r
        }
- [+ K/ t# b) O    }% Z) @5 h5 ]( _4 F9 r* x6 }
}  J- F' u# b4 z1 ~7 @8 k, P% X; ?6 Q7 }
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-28 07:02:23 | 显示全部楼层
循环队列。循环链表。。。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-28 07:02:46 | 显示全部楼层
这个题目就是经典的约瑟夫环
小甲鱼最新课程 -> https://ilovefishc.com

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-6-4 16:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表