鱼C论坛

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

猴子问题

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

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

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

x
大家好!# P4 b; h5 ^9 y2 x9 m
这几天我在忙着编一个问题,我用了一种方法编出来!, a( w, g2 N- f" [  |2 R0 [
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!; Z/ {7 n6 Q, H( i% u7 R
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ( k, ?! S! p+ n$ }
8 [& s1 M" {6 s- H- N

" K7 H: I  H: \7 b
                            题目% t4 o7 p3 C' {
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
% u5 F6 f2 R/ P第一种方法:利用循环链表( i( Q2 A* d" g: [$ w
#include<stdio.h>
/ n/ `9 O8 T# M3 V- r#include<malloc.h>5 A9 c: a# P8 H3 Z+ N
#define M 8            //共有8只猴子- h3 x) d: {4 L5 n0 a! C. k( V9 m9 r) ~
#define N 3            //数到3只时退出第三只
" N3 i' w  n0 F" |/ W* ktypedef struct monkey: m! W  O# R, T3 y
{int number;
. Q0 P& r# T; ^1 m* \0 |, Kint flag;2 G- }( K2 a$ H8 s5 N
struct monkey* next;
# |6 U0 [6 f; g; n}MONKEY;# n, V) K9 h) N! h) r  n2 j
main()' h5 W7 ^2 w' s# @, t. s
{ MONKEY *head=NULL,*p,*s;' P: g: E$ `+ o- }5 E+ n
  int i,sum=0,count=0;* G% \0 H! E' q; U2 }
  clrscr();              //清屏
, h# V, n4 {3 o+ B  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存0 K2 A6 e- Z- A  f
  p->number=1;p->flag=1;
0 u! ~2 u" K1 f) Z( I  p->next=head;
  m% M1 ~; Y; J3 f! d  head=p;( e) f* t% I6 G# J
  for(i=2;i<=M;i++)3 \. [* a& ]7 z; v; z
    { s=(MONKEY *)malloc(sizeof(MONKEY));
5 O# c( x0 z+ O5 x/ `" I     s->number=i;s->flag=1;
' p( N% s* i  W& q     s->next=head;, e6 r) C5 x, o3 y* a
     p->next=s;p=p->next;
1 q# \: I% `" _  w; w6 ?0 s1 K    }; E  T  K! P6 K" Y- Z
    p=head;
& T5 J: |+ m, B% H   for(;;); |( I6 `% N! H9 |% L# k& z6 X7 w
    {if(p->flag==1)* w6 ]+ `/ M' L
       count++;- A& r+ v0 t  `, b$ h! e" g
     if(count==N)  o5 K6 u0 @) i2 ?
        {p->flag=0;
2 F) X4 O. t8 R! k" j: i         count=0;
" l, B$ t2 V; L, R8 ^         sum++;}8 O0 }  W5 Q! P3 z; g) y6 a
     if(sum==M-1); y4 e& V* E2 M9 [- A# `
        break;. W  o8 O2 Y. W$ k3 k
     p=p->next;
. q0 F4 d3 R+ C" @! [! P( R* S    }
* a- T4 u9 d; B" }1 o    p=
) o2 k8 x0 y( F7 @) J  q    head;+ }4 I6 H: J' m# W3 b) J2 @+ h; m
    for(i=1;i<=M;i++)3 v; S6 {3 X6 w3 v( t1 {$ e8 L
    { if(p->flag==1)* b7 j/ v) J" q% X
        printf("\t%d",p->number);
; W" m, @/ J" I- X2 k      p=p->next;, N. v# b1 T; h! G  z0 @+ E& y
    }
0 t6 F; M: ~+ ~
& L& a) ~- {/ t9 p7 Q7 K# C4 X+ @+ L  E

/ u/ W( N3 N- Q% ]% c9 }* ^% d9 [}
0 Y, K, ^( X% n8 k* f- M- {, D
第二种方法:数组
( ?+ o9 }4 y$ Z& u! `" }#include<stdio.h>/ Q6 ]9 z, e) K' c" N& a+ _( k
#define M 8) @/ X# W2 V& i  p4 t! D/ O! @
struct monkey2 s* a, y$ ]' l% r* T  y' p1 l
{int number;
, s( `# d8 X) \9 {( ]int nextp;
( U/ @% h& ]: g+ U}link[M+1];
4 w5 c) M8 ^( D/ S% X9 S: u
! [4 l, T3 ]: u" O2 gvoid main(); w9 T: f2 n& Q7 j: ^; ?
{int i,count,h;' G9 a! v* r# h6 @1 w5 X# q* j
for(i=1;i<=M;i++)4 j8 \8 Y( X; [( m( P' ^8 D4 g
{  if(i==M)+ R, F2 S+ y! v. y/ [# _
   link[i].nextp=1;- {( \6 Q# M: o) v
   else
; Y. d( ?: @+ m' Z7 S/ e   link[i].nextp=i+1;
9 ?6 g: M/ `1 C+ F; Q" B( i  link[i].number=i;) Q! ]) F) Y4 H! t
}
% E$ Y9 o: Q- tprintf("\n");
/ h: c6 b% A. I- ^! U% ~5 Xcount=0;
: Q/ x9 Q( n  r+ qh=M;
* x! t7 u5 P# A* ?: W! L1 Zprintf("依次退出的猴子: \n");3 P( R, \, m3 P
while(count<M-1)
6 F  Y  d/ |& u2 Y  t) ]{i=0;
$ H6 k; o" A( S$ Awhile(i!=3)0 p+ @) m) s; t( \+ P
{ h=link[h].nextp;
0 K* n9 d7 ^# n3 r$ P2 N, q5 f# S- c   if(link[h].number)
" T; U2 N! @7 m$ j& c     i++;}
: g# e! ~% [$ y4 [$ I6 J9 o7 A2 g4 o/ \! ~. b
printf("%4d",link[h].number);
0 Z; A3 f* i. u( m: q0 T0 r& glink[h].number=0;
5 Q/ d  Q7 ^* s  \count++;
" F& A5 i; t8 n0 T9 ?}8 J6 O& B) t) B' v, ?- {, g

" N3 g" ?- g# Z& F* ]' dprintf("\n大王是:");
) I9 S! V" j$ T. o& C  M  for(i=1;i<=M;i++)1 m. t  X# x8 G3 w( ^  L
  if(link[i].number)7 X! {6 @6 k- p7 B6 h
    printf("%3d\n",link[i].number);7 Y4 v! v8 b1 C
' A9 c7 _% \8 ~* F# E
# W/ }" O4 g# t- E
}

' c8 x* i; R8 x$ t+ F第三种是普通方法for循环
, M9 s# c/ m0 X3 b8 O  v
#include<stdio.h>: Y+ K9 t3 x/ l! h' N$ _
void main()
1 G! e& O! y" h2 X{ int i,k,m,n,num[50],q,*p;
& U! k% G8 e/ ?1 x% T) W, a+ ^; z    clrscr();5 m! B& u+ e/ }7 q+ |; Q* h7 v
   printf("input number of person: n=");
4 }% S8 o- S  X9 K+ F4 e+ h9 a    scanf("%d",&n);7 t5 d& [$ s. B6 Q5 c' g
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只+ b2 K$ A. s8 p. _7 p% w
    scanf("%d",&q);
1 ^  @+ D( V$ n) X6 _   p=num;! \2 F9 [+ }; t
  for(i=0;i<n;i++)7 e/ c8 ?' W. w* ]
    *(p+i)=i+1;% A! A3 ~: ?% N5 m# R7 e6 C$ _$ C! K) Q
   i=0;
8 s$ P4 O5 r3 g! ]! L   k=0;
( L$ [- D8 ?" V3 y+ g. y9 n   m=0;; m. a9 e/ h& r" z8 P7 l- o
  while(m<n-1)' F* n( ^3 Y3 i% X3 c
   {if(*(p+i)!=0) k++;
. v! a* V  X' s% t  m# ^2 h     if(k==q)4 H' D, D& i, Q2 Z; z% _, T
      { *(p+i)=0;3 V1 S) [& p8 e- E. Q( t- a' `& ^; H* m
        k=0;5 j5 u" N8 @9 b4 Z2 r
        m++;
4 N6 k7 }" c2 b' Q" u1 v      }
) O6 I7 e. k. {# c6 _    i++;$ ?- ?2 ^0 |. J
    if(i==n)i=0;& i  H% [; K* N
   }4 C6 d& g: R- n& U# Z) v
  while(*p==0)p++;
8 _8 h3 Q; ]2 O! o    printf("The last one is NO:%d\n",*p);
% U2 y$ Y2 x, D* Y' K& _" _     getch();& S( p; \; k. y$ a( f
& n  X: c5 w( A) K
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
6 I& `3 s9 G6 K* c& lnamespace 又费马达又费电3 g, o3 G' v. |+ m+ @
{/ p, ?# j- U. D
    class Program
+ [9 K: N, ~- h, _  x1 j' G. M5 d    {+ ~# Q) {. Y+ D  w  _/ W
        static void Main(string[] args)  N# L5 S6 W9 r0 j: {" Q4 u1 S
        {
3 l. y8 `9 A/ `' D            int m, n;
' E! Z+ c! \1 P' C, V, d' `  K0 \            Console.WriteLine("请输入数组长度");
& Z: C# k7 B- h4 v* A9 ?- x4 K            m = int.Parse(Console.ReadLine());//m为数组的大小6 v; f, ]! G! l' [$ `4 W
            Console.WriteLine("请输入要截取数字的大小");
2 e6 u0 ]7 x5 d! `$ \: y            n = int.Parse(Console.ReadLine());5 R3 ]/ S7 f: K6 G. P/ u
            int [] numw=new int6 w2 c3 s9 o" L4 k2 A

, Y" r- P( q6 }0 S% x. G+ s; j&shy;&shy;&shy;;( M/ _$ z$ `$ r3 r
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
# i+ e0 E1 z9 H% w/ B5 j: w% U9 E4 M            {/ T$ h) |3 @; U4 k. l
                numw[j - 1] = j;
$ P9 Z1 f9 A, i6 b            }
: W% \' y5 h8 t. i5 ]  p& g  p            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!. Q8 {4 ^* [2 \9 ]' n
            while (d != m - 1)
0 |' }6 B) ]" G/ c' R1 M            {* t, w9 w" W2 U3 l& w
                if (i == m && d != m - 1)
; i: j$ ~! Y$ h' g, o                {
1 L" \2 r) e9 `" L5 F( k                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
% h' X$ i7 G/ s                    continue;
6 L, G8 i# V# H4 [4 _; V                }: O" w- u6 S" v
                else
  _$ v0 e* z" }. d. v                {5 e6 m$ y6 M# Q* d7 x" r
                    if (numw[i] != 0)8 j& |6 R, k. s8 k1 T6 G, z
                    {
& W2 o' C, ]! G: j' C# {1 ^8 e2 c                        i++;5 w% t6 w% ^; Y" S  C# m2 T6 N7 F
                        k++;7 R$ L4 K) N; [, t4 [3 d
                        if (k == n)1 n8 g7 Q8 B; ]  \9 B
                        {
* n; E/ O6 u% O% d                            numw[i - 1] = 0;//把在n位置数组元素的值改变了$ H% X$ s( Z% U
                            k = 0;
+ `# Z& k" B, ~' p/ N0 |. ?              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1# q. t5 U5 U! J( r" T4 }
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
6 s# X$ T! F  G. j1 p                        }) ]; R' ~" t( w0 t1 Z
                        else//输出暂时还没有改变数组元素的值
. h6 `" C$ n" q+ g; S" J* f                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
% L! l' A1 }( O                    }8 |( K& y6 ?: T# W2 s0 w5 u8 x4 W
                    else
4 y  }6 P! Y4 z, r8 X2 Z+ _. v                        i++;//数组元素为0,直接跳过,不计数。。。
; x' z6 V3 t( \, q' t                }
/ w  {" h3 T5 k2 g9 s( j' |
; e, ]3 T4 ?- ]9 a( g
3 c) m1 u; }8 U2 |; D            }//结束while循环* Z6 B6 D: t1 }' F2 G% A" \  ^
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
, e, ^" [1 r2 K1 M% E           ; e2 n( R" ^4 z$ u3 _9 C- f& A
                if (numw[i] != 0)! d6 ~" J# x+ i: {4 C0 H
                    Console.WriteLine(numw[i]);
7 ]- Z! S; y* B: T9 z: [4 b! N           8 P8 _) G! S& F
            Console.ReadLine();
3 Y2 J* C9 E7 l- J        }/ N* O: E! E( K
    }
5 y+ i" w9 l) S  {}
1 e; ?0 [$ }6 P/ n3 O4 e
小甲鱼最新课程 -> 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, 2025-12-3 04:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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