鱼C论坛

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

猴子问题

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

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

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

x
大家好!; e2 Q% i. ?: }
这几天我在忙着编一个问题,我用了一种方法编出来!
8 W. }; {* x- V! @但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!; a4 a+ h1 ?; R9 ~, g+ ?& H8 P
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 9 v! f+ n+ l% W8 ]8 D) F$ @" Y/ u1 T

7 t( n( [: w1 T* t0 i2 ~* h' e) @% H; p3 x: ^0 T2 p) @
                            题目
+ a4 t' j) Y) j6 @" [5 ?山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
% C. U$ A8 y6 ]% o- B第一种方法:利用循环链表8 w" L; e( W. \, y: _# J+ [  p+ Q
#include<stdio.h>
/ h! ?4 ], V0 @/ ?; F#include<malloc.h>
" w. v9 n# U! j1 _) ~* X#define M 8            //共有8只猴子5 J$ u6 M+ K) F$ n2 C  W3 _% C! d
#define N 3            //数到3只时退出第三只
- K( G' \9 |. L$ D) [) Htypedef struct monkey
( N( ]' A% Z' A  w{int number;* ~3 W2 I5 |/ T6 d1 L" j+ t
int flag;/ d9 v* D& U) K
struct monkey* next;
2 Y9 w* D; ]  `3 G9 p/ r}MONKEY;% _, w- q7 g7 f0 d7 H$ O+ o% Y2 t9 c
main()6 `' z' s5 m+ }) _( L
{ MONKEY *head=NULL,*p,*s;
: R/ j- P3 K4 h0 d7 p  int i,sum=0,count=0;4 d! P4 L+ Z! G& m
  clrscr();              //清屏1 S4 k) Y: J; ]& M
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
0 l* `- ]% c9 G* T- b) H: j. ]: `  p->number=1;p->flag=1;
7 ]: S, K- K1 z) f! q# @  p->next=head;/ F/ M7 j- N9 V/ T) a3 G
  head=p;* i2 |8 [4 v) B: p2 Z; o# Y4 l0 @
  for(i=2;i<=M;i++)7 ]' ~! E7 i: `# b1 M* o. G
    { s=(MONKEY *)malloc(sizeof(MONKEY));: o! q  f/ p6 j$ g0 v* w
     s->number=i;s->flag=1;
2 u3 t$ ?) j! G. s* B     s->next=head;- ]% f5 f. N9 f" r
     p->next=s;p=p->next;. N& a, s7 I. ?: f8 W1 B
    }
/ Y+ {, u# [% s& b) s( @. C2 G    p=head;
! a3 ]; @! e) [   for(;;)
+ h/ B  `7 ]( A! E' I. D    {if(p->flag==1)
" k9 h- z' n$ H% n: C" y6 \: ?2 \       count++;: h, G6 v+ B, y  A# l: k% A
     if(count==N)
% x- K- Z' d; a$ @& L  e        {p->flag=0;+ W( p/ W) i1 M, d9 S9 u4 f& U
         count=0;
- a- J5 N% @5 p/ z# E2 `8 R         sum++;}
- L% m8 q; \' v8 S: b) l  s     if(sum==M-1)
/ u" Y& ]( ~0 c! L) [, U7 n3 E5 G: A9 n        break;
/ R' _, C  m! O' t* P1 F2 R     p=p->next;4 F1 P/ U9 h% e- w. G0 H
    }- {0 C' o3 ^4 R: v+ ]" L/ o
    p=
- }7 y& R9 d/ K) V    head;
! Q' d  x! M+ r% [8 F    for(i=1;i<=M;i++)
$ Q' e& {" r( U! {" X2 g    { if(p->flag==1)/ i, s/ N9 M. u; S$ B, N; z' I% T
        printf("\t%d",p->number);
+ |- y( `. L) W      p=p->next;
- P2 U! d2 c4 F# ]0 g% b7 `4 |    }
8 J: G8 F1 c4 m% B/ x! e7 y4 V6 W# ^5 j# Q
  v( _6 a# P" \& Q/ g

2 h, n4 f! |+ V3 ]  V1 s}

/ d: V# j+ c3 H) n! }0 R第二种方法:数组
' m" Y2 C/ `  q( X! z, D1 Y8 W. K#include<stdio.h>5 [: C" i( _3 Q
#define M 8/ P. r: r# R+ f
struct monkey
  u( s! x' u+ T" {{int number;
4 \* f! t5 @4 k+ s. Q! [int nextp;
5 r4 X8 \: k4 m# U4 |* @9 q}link[M+1];1 N) {: ?; h) B/ r# o) v
* [, Z  s- r1 C+ b4 Q7 U4 {# F
void main()( h1 R* b7 L: w$ f! @
{int i,count,h;
6 V) I* o' T% y+ s1 ^3 I( ]$ Kfor(i=1;i<=M;i++)
9 g( t+ `! c/ D  V- T: G) f{  if(i==M)# b4 O5 L) g! j+ M, X5 q9 {6 L/ z
   link[i].nextp=1;3 s) L+ b+ ?  Z$ d/ }! A
   else
( ~8 @( L7 i" Y7 G% x1 k6 F9 t   link[i].nextp=i+1;4 E" M' Z3 t4 D- s
  link[i].number=i;% r) @; n2 V* w
}
7 }( j( i* [+ g: U; h, \printf("\n");) W: Z$ q* \- F# P5 k8 ?( M
count=0;
6 a( V% [- l+ Eh=M;
' D1 {& w5 ~; dprintf("依次退出的猴子: \n");
# `" y, u( O) Hwhile(count<M-1)
! ~6 ~: n2 ^3 f: i7 s. `- U; H+ j{i=0;
4 q- i; N  {# \" ?4 Z5 Ywhile(i!=3)) j9 i2 v$ {  _$ F1 }# \; ], X
{ h=link[h].nextp;, n; j0 c& [$ V, ]# _
   if(link[h].number)
6 e* C* D) d$ \. [) W     i++;}
; @: ?: m! r+ |) s/ E8 N4 V$ ]! ~5 Z( K8 d5 J- }
printf("%4d",link[h].number);, X1 }! t7 d/ ?+ d% r
link[h].number=0;
+ F% \+ z& ~9 R6 Lcount++;# ?/ Z5 R$ {- G6 y( f- I
}* h5 k' {* m, w$ g) k# @2 K
  B" ]4 N# g6 @
printf("\n大王是:");: Y7 I7 ~/ H1 F
  for(i=1;i<=M;i++)% l9 C5 j+ U9 [7 \4 |
  if(link[i].number)! t4 s" y' ^+ I
    printf("%3d\n",link[i].number);
; Q2 y: g2 l) w' o0 |& {( b3 O6 G. P: x# Z

$ ^6 S. ^& e' q& K}
5 ^1 q! C: ]1 @6 c
第三种是普通方法for循环

% y% G* e8 @- j: T$ X6 `#include<stdio.h>
3 Q: @2 \. a8 n$ tvoid main()
( ]; y5 A; v8 K2 X- I6 J{ int i,k,m,n,num[50],q,*p;
1 j6 F5 e9 u+ t    clrscr();) D, @( |7 A" g3 W3 s0 `4 b+ t: i
   printf("input number of person: n=");3 l; V! o1 G& {. e5 T
    scanf("%d",&n);7 U5 S" I, g; ?$ |4 g
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
7 `6 g6 I# F/ }" s4 A    scanf("%d",&q);
' b. e0 ^' W1 d1 u( D0 y5 G   p=num;9 g% p5 R1 k* `! |$ F7 v
  for(i=0;i<n;i++)1 q* z, g. \3 I
    *(p+i)=i+1;
- D( Q- p- j4 R' m' P; _   i=0;1 J1 o* b3 p+ e7 u% Y3 |8 F4 H
   k=0;
  E( O, o8 {2 C. t   m=0;
% q5 t! T# m7 P1 }- T+ z# c- {  while(m<n-1)
$ k  F6 Z! A$ O4 a0 V( Z6 [   {if(*(p+i)!=0) k++;( y/ I/ R0 J% o" B" I
     if(k==q)
! B; U  w" ^  n      { *(p+i)=0;
9 K% j! a/ V5 l# J, Q$ [/ G        k=0;9 V' {; h% N* K7 G- l3 P
        m++;
# }4 ?; q5 a+ w0 Y      }
  {/ h9 L$ W& e! n& g( {! N4 u    i++;  j+ ~4 e# Q& F- M6 S- O. e/ y$ `
    if(i==n)i=0;9 o+ A! |1 J6 g4 R2 z+ _
   }
# Y% ~1 i- B% X" b' C! G' ~2 }3 a  while(*p==0)p++;; Q" }) _& k5 O' _5 u
    printf("The last one is NO:%d\n",*p);0 {6 G( z+ K3 g  r1 m; ~
     getch();$ m. o8 O2 a4 ~1 I2 L1 M' r

. o; o1 R* R+ q, Y, x- R}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;' s, C  ~8 l  l- Z0 D
namespace 又费马达又费电
6 Z$ Q( R% m1 T0 t' \{; m% R( u8 H1 C
    class Program
1 b* C& J6 D% {# F! G. r! D  W    {) N/ f3 w8 l! G; l9 B
        static void Main(string[] args)
5 i7 Z  m: _5 W% U        {9 y  ^$ H! v5 \, c! b0 ^- A$ `1 S/ _
            int m, n;7 a# F& P! X: _6 z' J8 b& @! T
            Console.WriteLine("请输入数组长度");
# A8 ^/ w$ a9 Y4 K+ \( ]$ Q5 l1 C            m = int.Parse(Console.ReadLine());//m为数组的大小
  R/ i9 |" r, {% Z' h4 G            Console.WriteLine("请输入要截取数字的大小");3 v  W2 F, V4 E* r5 s
            n = int.Parse(Console.ReadLine());
/ b! F& h4 t% o1 g+ ?3 ^1 T            int [] numw=new int
7 B1 ?$ x  Y% H& W' N4 P5 u& l+ S) g
- X$ C3 c! ?! \. F% ^1 j8 d&shy;&shy;&shy;;
0 N& R: h/ P2 \/ n5 C; w" L- c            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数1 X; g, W; ~7 ~8 U; ?- j
            {
1 _' ~0 U" N, }4 Y  x8 n                numw[j - 1] = j;. ]' D; c4 O; |
            }1 G' r# U& o" E- ?6 b+ c/ h
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!+ j' v# \& r2 Q0 E. }) t0 R& y& h
            while (d != m - 1)
: b+ O/ u, ?# v. U: p; X( }            {* y7 I; A! W$ y/ K. }* c- F
                if (i == m && d != m - 1)
# N1 G5 x6 V6 W2 l8 w9 j; \5 S                {
( T( w: A  u  g+ `5 X" \- g8 g) E                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!: Z$ ]$ L' q+ G/ `. ]' ^. K
                    continue;% j7 p7 u! @1 m& S' N6 j2 S" ~
                }
% D! H2 H, P, c! w1 s                else
+ v9 ^7 g2 f& D- _6 z* E                {
( s1 h% A( ^- [, h# K+ P2 o) b                    if (numw[i] != 0)
" R8 q$ _3 v) |& T7 R& a+ K                    {
# Y6 P( ~+ c1 s& y                        i++;$ O  \0 [. j0 a/ P6 f
                        k++;6 T+ @' q% S! K+ C2 a
                        if (k == n)
7 h) m" x3 ]4 F( z2 o                        {2 D# `& c6 B6 q# b0 u' R& J# O
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
" H% f* ^3 K2 a5 c# U) m% G                            k = 0;
# i  K- C" J- i2 y. {5 J              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
, c7 @! [4 ~# D% o; Y                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
6 B) j2 I* V; ]                        }
( o( v6 I- a+ U, H! t                        else//输出暂时还没有改变数组元素的值
# S; E% \, D3 L                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
+ D: H4 M6 {+ U0 T0 x8 F                    }
3 }# n  ]1 I$ _0 f( g, J                    else
9 R' R1 E. d$ `5 t# s                        i++;//数组元素为0,直接跳过,不计数。。。3 t3 E& d4 u7 L. p
                }$ T7 g1 m& ~: p# k3 e/ x) D; t% e

$ F% F! L  J! ?) b% x1 U0 k# [6 i, \3 z
            }//结束while循环
+ I" ?( Z& z% [1 b/ E) A            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦9 T! d/ k6 ~" x" B: T  k7 I! Y8 L
           ! N. ^% u( O. \8 d3 d
                if (numw[i] != 0)' g2 Y$ o+ {& k" d8 m
                    Console.WriteLine(numw[i]);
6 `% L0 w  [7 |" h2 n           
. [4 {; i' M; r" W            Console.ReadLine();% B0 ~2 _9 k" P5 {3 i3 m+ c$ a2 U
        }3 v7 y! Y- X; [; u3 E9 `5 u
    }0 B4 W" o. `  |3 z
}
' Q5 h* y) j! ]2 P9 S, ?1 S+ c
小甲鱼最新课程 -> 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-8-7 09:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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