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

猴子问题

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

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

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

×
大家好!
0 [  a8 m9 Q! R1 U这几天我在忙着编一个问题,我用了一种方法编出来!: r: P  J" G+ C# S
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
9 T/ L2 T$ [5 ^7 b2 H注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
; g2 j2 [7 e. f  G  d# o
: P1 p% R: a5 A9 [6 v4 |
9 G' i' N! I: X1 |+ ^5 ?5 T
                            题目% q& m5 h1 m3 s2 x) K! p
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
, P1 g7 E- ~, A- M第一种方法:利用循环链表
" y% q/ W* w; c' i! ]$ Q% _#include<stdio.h>
2 u* a* \6 d. ?: g2 a) l+ F6 E#include<malloc.h>
  ^% H  d6 t$ A* D2 `7 H#define M 8            //共有8只猴子; \4 a. A& ]5 [6 k
#define N 3            //数到3只时退出第三只
" H* z  y" ^- z/ B  q  v* utypedef struct monkey
; w& K" q4 I" B( D! I6 i{int number;: d  Q; a+ g: y* k6 q
int flag;
/ }" y  [5 A% y5 R! u# y3 D& Astruct monkey* next;
5 Y+ x0 f( {/ n4 f, R  x) K( I}MONKEY;0 R2 B7 G1 J6 u, k
main()$ H$ w1 o& G/ H* @% R, @) b
{ MONKEY *head=NULL,*p,*s;
* ?! ?' n7 \' @% o. w  int i,sum=0,count=0;2 w: l) y9 i( F- D1 s/ @
  clrscr();              //清屏
2 O+ e' f  c) q' Y1 {- E1 Z- M& S  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
  ~1 h0 ?. J/ o5 N  p->number=1;p->flag=1;; x4 [6 A1 n" g# W3 n, N" }' v
  p->next=head;3 Q( o1 f' j0 z8 _9 J
  head=p;
0 e1 B: T, u; u" _0 q* E  for(i=2;i<=M;i++)
5 t3 m  B+ _) [    { s=(MONKEY *)malloc(sizeof(MONKEY));
; Q- K/ k' F6 j     s->number=i;s->flag=1;
) C8 o1 _* d. M: m     s->next=head;& {5 g0 L+ }4 ^" h& B
     p->next=s;p=p->next;
# d' ]4 ~. i0 U/ T6 n    }
" x2 U# v6 Z  b) ^; ?5 b    p=head;4 G- R5 [% c! L# G+ n! V
   for(;;)3 p7 v, A8 a' L1 _7 Y( ]
    {if(p->flag==1)
6 U; ]6 ]' a- n, _% v& |       count++;
& i! R) T5 D7 A0 ]" a     if(count==N)& N, e6 G% ^/ z3 D" m; v7 i* G6 j
        {p->flag=0;' {  B$ I7 l' N* W, H. m$ o
         count=0;5 ]& H( E* x  e  Y, G
         sum++;}
3 b% \$ z4 Q3 Q7 R+ H6 a  k  T* G     if(sum==M-1)# ~* I, _4 \# {' ^* k* j) B
        break;
! n/ s% Y% {+ {7 B5 K, q; j$ F     p=p->next;9 ], c$ W" ?* `, N0 q* B
    }, W0 m% y7 p5 D3 i
    p=* y7 c& a. p8 S: K+ l
    head;
' c" V+ Q+ d& U4 ]$ Z) ]/ w1 R    for(i=1;i<=M;i++)' L8 j' p: Q/ }- B! P7 B
    { if(p->flag==1)* x5 d4 Y! S; ?6 Y6 Z
        printf("\t%d",p->number);# Z) G( Y9 L* s. ^4 E$ n7 Y. l& I
      p=p->next;
- N% l0 G9 C/ p0 }$ K/ O0 i    }
3 _4 a6 z- {7 K$ c5 L6 B9 {. e
* s- F7 [" s; b5 `& {" }: P6 H  Z2 D
4 F0 G; R% T3 Z! D
}
0 E, j- }1 ?1 l5 G
第二种方法:数组, D7 a0 |! n# C% Y( g- _
#include<stdio.h>) r3 U$ f3 s5 g# Q( L3 G
#define M 8
/ W' _. e, k& S' Lstruct monkey5 l2 p5 J+ L6 W/ R2 o$ m
{int number;
9 M; b3 k9 Z* L- T* r# Y8 N6 kint nextp;6 F3 i7 ?! w& U2 b$ _9 g
}link[M+1];
# `  @( G% `) f
( ~" _, z1 k" Tvoid main()
0 m% K- |$ ?- B" }. U" g{int i,count,h;
; Y- c7 P3 {  b5 O3 _5 Lfor(i=1;i<=M;i++)6 q! H! T, q" q- B. k. s
{  if(i==M)( M, E+ ^2 b: S9 T5 B# x
   link.nextp=1;5 y8 [# i( ?+ C3 A  Y: B
   else& \" C2 N" j+ c8 j
   link.nextp=i+1;5 Y' l6 p! ^' }5 z, q
  link.number=i;& q- x" r/ a9 k5 a4 L
}
2 h. D/ r3 w) T1 Kprintf("\n");
, F8 {$ H5 C/ t3 Y& ^6 c: |count=0;
: J1 [, H0 x( e) l7 S/ k$ k& Oh=M;. ]: Z& J4 s9 d: d
printf("依次退出的猴子: \n");. P4 T9 D3 o* B8 [& w5 c7 F7 D9 B
while(count<M-1)$ u- {+ }( l5 C+ W
{i=0;4 @# [4 \2 m# ?3 P1 q8 i0 a
while(i!=3)
% F0 G& ~8 i' X2 O: N" H{ h=link[h].nextp;) J- \4 O$ w8 |- W0 d: ~
   if(link[h].number)3 D6 m: H9 S% A
     i++;}' ?! Z) D! P$ w3 R9 z8 `
) D7 K' N+ G: C' u
printf("%4d",link[h].number);
( _* w. ?/ `& Xlink[h].number=0;
- _9 l2 }3 P/ l9 fcount++;+ N7 v/ p% a# X
}
2 d! z5 {& e% |4 _7 N% h  \/ A7 V: o3 B6 ^  i. V4 \
printf("\n大王是:");2 B# H1 O7 M1 w: `' b5 J
  for(i=1;i<=M;i++)
$ \) V/ u- b+ P, W) m  if(link.number); I! E' m- T$ i
    printf("%3d\n",link.number);
% _! A! {6 W7 Z* j8 K. ~
( B' N' n. ]( k) G% v# v1 u! J4 k3 f* B. n0 i) ~
}

/ X( y/ R6 ]  u8 ^5 a第三种是普通方法for循环

% @) z# y7 J$ g8 t% x#include<stdio.h>
6 ]' i. ]6 R, Z6 p7 j6 P' Pvoid main()
! O) b. j8 f% h8 q1 B{ int i,k,m,n,num[50],q,*p;5 h9 {( M0 o9 M
    clrscr();
/ J) F7 a- i  Z8 K9 S7 g   printf("input number of person: n=");. v! M7 ^( o0 @
    scanf("%d",&n);0 s  q* u! G, W7 \( j( A
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只( M4 R! N5 H; o4 g6 y  t/ y3 }7 I
    scanf("%d",&q);5 y: [# [$ J2 t$ W$ c
   p=num;
* @: @. M0 V$ n! F$ b) T  for(i=0;i<n;i++), J& d+ z3 A: O, \+ p
    *(p+i)=i+1;
6 c0 u5 a4 X0 F. y1 j/ v. o   i=0;
: A, E2 v' ~' N$ i$ F4 Q   k=0;
0 f7 h4 w" p& ~1 W/ e! O& Y6 H   m=0;% l, m; Q' X- R, I; m% u
  while(m<n-1)! C  J/ b6 a& V2 F& ]
   {if(*(p+i)!=0) k++;
$ b, C7 s) `4 Z0 P4 c+ K5 |" x5 M     if(k==q)' f' U: L& A9 }) }" f! c3 a  b* {
      { *(p+i)=0;
' v3 H! ~8 K; ~6 q9 F9 m. K( a        k=0;
4 E; D0 w; i4 T# b7 E: t        m++;2 X+ L: T( Y) ]' x# e5 f* q, v
      }- a" [2 v$ z- r- ^, P& c7 @
    i++;
* h$ s. p1 \  U    if(i==n)i=0;
0 z# W5 K" F* d7 q- b% X9 C   }
  J& }  |& D8 q5 M  while(*p==0)p++;. s5 Q; ?  X2 d5 x  n+ c
    printf("The last one is NO:%d\n",*p);
  L1 F" _% G% b     getch();
  a2 W* K0 b3 q+ }) w( b5 I; [- q7 Y  L% Y2 K1 q9 Q
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
( B: y7 o7 {2 P0 A/ anamespace 又费马达又费电. h" f6 k) e. d# }! x
{# s' r) [: c5 }/ }/ c
    class Program
, U+ c/ L' I; ?' x6 `) b! y) f    {
. s9 ^4 Y1 Q( F( `! b4 ~/ N        static void Main(string[] args)+ \8 ?' b: c4 B! N1 X7 A0 R+ }
        {
" G* K/ o6 ]9 S* \; G9 ~- g+ m            int m, n;9 @8 w2 W6 [1 u8 _* Y. l
            Console.WriteLine("请输入数组长度");! J& i# ~7 E' a* ?9 E$ W7 |) W
            m = int.Parse(Console.ReadLine());//m为数组的大小
1 Y8 E+ ?. e  P. v, O3 P            Console.WriteLine("请输入要截取数字的大小");4 C/ U: G- U- C: V! H
            n = int.Parse(Console.ReadLine());1 s4 p: h# T! F, f
            int [] numw=new int4 v% u* x, n' \7 G2 R/ B$ U
* Z0 J3 l+ v( |
&shy;&shy;&shy;;
; E: v6 L, N" r8 P            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数3 g' }# w  k( ?( z& [; F  b
            {
* W: u9 N6 e1 S+ U% `                numw[j - 1] = j;
$ `4 l% r, h, E0 j4 K2 V/ I            }
  T: l' C) |- \* X6 @# H4 b7 z% l            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!; I: W, g  a/ B% j
            while (d != m - 1)
) p6 q' j1 d1 |8 S. \5 Y            {
' ]% S6 K) b( n3 G# I                if (i == m && d != m - 1)8 W7 ^; q* c  r8 N; `
                {% `) f# D7 r% w3 m& k+ e
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!4 f, Q- G2 K( @
                    continue;7 ], \9 ?) X$ `( h, p
                }1 k: L5 L' z6 i0 i( \# x& A
                else
/ ~4 H  s) `; I                {
* h# ]- l7 F) H* `/ O' }9 \$ L                    if (numw[i] != 0)
& `1 K! Z5 h( v$ i) \5 C3 _                    {6 \- y/ G7 P" c) s  p5 m  p$ e/ R
                        i++;
) ^% J' ?+ h+ r                        k++;& L* I8 Y- i$ T. K
                        if (k == n)/ Z+ c: W) l  G, g
                        {
% d' m8 M! Z4 \# W' |                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
: j* ^* T- h! X- n2 \7 z7 f                            k = 0;  `$ g3 m# d- h+ F" `
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
% `  x4 |) B9 B8 E) \                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
6 R6 [9 \" O. X: p* k9 ?- d# a                        }
' Q0 x7 }; i1 `                        else//输出暂时还没有改变数组元素的值
3 D6 p+ N0 X) s; b% p- I, I  Z7 j                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
& N. y; N5 C3 O' J  A6 ~                    }
% G% Z! B, d5 r                    else2 t% l+ [% s3 `
                        i++;//数组元素为0,直接跳过,不计数。。。5 `8 L) s1 h) q
                }1 e# x0 q& M0 y1 d4 S

6 V: z9 L$ {0 ~" ^0 F- t5 ~* {. I3 O- c3 }) X& s
            }//结束while循环
+ B7 {7 s5 p$ P* F1 i; ?: [" e            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
* T# q; x$ @& u, v" u           & k3 g3 a! p) @1 r* E
                if (numw[i] != 0)$ f* ?' a1 }% g$ ]
                    Console.WriteLine(numw[i]);
; W7 ]) {  a& ~           ! |  |% H4 |" \9 k9 H1 E
            Console.ReadLine();1 }3 H6 [( a0 ^2 f  [  I  T. m
        }5 u# P0 t3 G; ]4 g; i( u
    }
. y! k8 g8 C, ?; J8 p" q) g: s8 J}
: X8 Q0 C( @  s6 h% E( P6 i
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 1 踩 0

使用道具 举报

发表于 2011-12-28 07:02:23 | 显示全部楼层
循环队列。循环链表。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-12-28 07:02:46 | 显示全部楼层
这个题目就是经典的约瑟夫环
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

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

GMT+8, 2026-11-9 21:42

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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