鱼C论坛

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

猴子问题

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

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

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

x
大家好!
$ i9 Z8 ~8 k6 o; w这几天我在忙着编一个问题,我用了一种方法编出来!; @- g( D" I" T
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!( h! F7 M* r# v3 g
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 . e5 V# o6 f8 {: h3 v

$ Y; N9 ?3 Q% E, x9 S! Z8 B
& `& ~) d- S8 c! q6 g( h
                            题目; z) o( I, r  ?2 u( _
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。. u1 M5 q8 Q& e7 e( k
第一种方法:利用循环链表( W1 o9 a' j! q
#include<stdio.h>9 P7 W* ~9 D, `: @6 z5 g# y# V
#include<malloc.h>) |6 K- S0 E7 W  P& u2 t; L2 }
#define M 8            //共有8只猴子! c( [( l- o7 C) v% {+ J% M
#define N 3            //数到3只时退出第三只0 K$ e8 z# E) d. m8 m) L1 y0 L
typedef struct monkey, q7 w2 V( }0 I
{int number;
& z) w  x: {$ W& m! n7 Vint flag;
2 p; q/ X* ?# n6 Rstruct monkey* next;7 d1 @, Y1 }8 n2 @$ Q  N0 P" X
}MONKEY;
# u  b. Z4 U8 e" Imain()
5 L% E8 P3 M9 {3 y- i2 n' K{ MONKEY *head=NULL,*p,*s;
6 V6 x9 s, H5 F$ l2 u  A  int i,sum=0,count=0;, G( O, \- u2 m: U
  clrscr();              //清屏( B) E, ~4 ]% p' {
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存) _( T8 Z6 U! R/ y9 k! }
  p->number=1;p->flag=1;
9 G' d/ @* M4 Z* `" ]  p->next=head;
0 L5 B8 ^3 O$ U/ Y( g! a  head=p;' U: \+ ?" J2 l9 h/ M! E" B, ]7 n
  for(i=2;i<=M;i++)/ s! R; _/ O. j. Y* M0 g
    { s=(MONKEY *)malloc(sizeof(MONKEY));
1 l; M+ M: \) M; A& X% M     s->number=i;s->flag=1;
, l, @; z+ q9 E. _, K     s->next=head;
( U- b$ ]7 C8 J; n; m6 V+ Y     p->next=s;p=p->next;
, S4 a; r# ~0 R, P    }
2 ^* r3 y6 |  s; p    p=head;% A7 R/ A: p: H# _
   for(;;)
+ {/ c& [" ]8 W4 ~7 O; `    {if(p->flag==1)2 {7 j, W, n; Q3 [% q* ?
       count++;
/ r5 A3 j; t/ L2 f     if(count==N)
( ^( C& Q' }+ O! U        {p->flag=0;6 [) J2 r8 p" v5 n# \0 [$ O8 M
         count=0;
9 a3 |+ M! r# O1 [7 x! v" U         sum++;}( U4 E  [  y5 E! O' r+ j) F: T4 I
     if(sum==M-1)
% Y3 d$ S) M/ A  u; a        break;) k) Q8 H1 P: q- g# D( T
     p=p->next;
2 u8 u2 s) \& w, G3 @: N' w! ~    }4 \( W6 `0 {  w
    p=# ^$ D/ `6 M" e% ^* J. i3 R+ |$ A' K
    head;
& ?. ^. p+ i) n" t0 s+ P& O    for(i=1;i<=M;i++), T. n. S& a# u9 H5 l: E- e
    { if(p->flag==1)* f. U1 e) f$ \) P+ v6 L( I8 |
        printf("\t%d",p->number);
" T- @1 i- {8 ]% P+ H2 M      p=p->next;
  T* F- {8 z3 Y* r0 A    }7 w9 u4 |9 |# L8 r0 {& G/ N4 W6 o
. p. U, i' ~8 ~8 Q

; p7 X( N; o; d- W; z6 X
2 k7 W- U  W+ Q/ q}

/ \; `. _+ a& o第二种方法:数组; o( w) X" `- |. L
#include<stdio.h>$ K% S6 O! P4 i1 j4 y# s6 O
#define M 8" q, f) ~2 U  v' B) E: V
struct monkey- S' Z3 P' }% T$ T, s
{int number;
+ ]* k# w. o% g4 p  l8 Cint nextp;8 h8 }; t9 b+ S' E0 V  J; C8 L
}link[M+1];3 h' @0 j4 p8 i8 V+ g# {6 f
( J" I* M) C4 Y. W/ j) b/ M4 ], N& y
void main()
& b1 m2 r% K+ V0 P4 t{int i,count,h;) R1 O$ J; f8 B/ x
for(i=1;i<=M;i++)
$ z" _: ]: a& I: E{  if(i==M)
/ u) G0 v$ s. C/ M8 q0 O+ k6 U6 ]   link[i].nextp=1;$ U$ P" C( X/ Q8 s% \
   else
4 e! R; }0 I; j+ K4 m. m   link[i].nextp=i+1;
- u& z7 f6 \' Y, v; w  link[i].number=i;. H0 O# r$ N! O) ?' y! o
}
1 m* j: N$ @  o5 hprintf("\n");
- B+ r) V, r( |# W/ [6 _6 fcount=0;
& K0 a" R& f8 ^$ u$ o& R1 G5 U& s' ch=M;5 Z8 Y  Q0 z1 k# \1 i( D. ]
printf("依次退出的猴子: \n");
6 M) a1 \6 Z+ y: E( A1 @while(count<M-1)6 L! N# [& }- Y0 Z
{i=0;+ e/ K9 T. r3 {/ ?: r
while(i!=3)! m8 {# e' P* `
{ h=link[h].nextp;
6 I: k" J7 Z, @9 x! R/ N/ A* z( L   if(link[h].number)
! S% s% q  C/ R( C! g# c# a# @     i++;}- q! I2 l$ i+ Q' t6 \) t2 l/ n
% b8 z% z: B% g/ q) i$ Q. M
printf("%4d",link[h].number);9 W8 S& w+ D* Q* t0 [
link[h].number=0;
$ t  X6 x1 @! J0 v! Z) Kcount++;# I% j( t& y9 I% D" P
}
1 B* p7 Q' H; E' g) L, Q6 L7 `
# W; l; N8 A& a) X: l. {4 Cprintf("\n大王是:");
! N6 m! ?- t. A$ A+ q  for(i=1;i<=M;i++)- [! a0 ~9 P7 L; `' L
  if(link[i].number): [1 v8 o  P( ?, P& b. l
    printf("%3d\n",link[i].number);
: k* m# C/ m3 u, @$ u5 r6 I5 E; r! E- O/ \: g
7 y1 c4 X6 _- Z" \5 m. ?1 c6 f2 w
}
; E, u1 z3 F0 Q0 L2 B
第三种是普通方法for循环

/ @# Y: i- `# `# {- I7 A' X0 C3 a#include<stdio.h>
1 Z/ k) x. H1 d. w4 n6 j: \* g0 Fvoid main()
. m1 e) u4 d$ @5 Y7 l{ int i,k,m,n,num[50],q,*p;
% {8 @! _8 C5 p5 D, d: h    clrscr();1 b+ ?& P  l$ L# ]
   printf("input number of person: n=");& n, b( i# B+ Z5 I2 k1 M& L
    scanf("%d",&n);2 \, \1 S1 [8 X3 I7 M4 G
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
  q) a% ^# D1 @    scanf("%d",&q);
$ W  X- j, p4 ^% k* V% }2 P   p=num;
7 A. [) o: l3 C+ [+ G  for(i=0;i<n;i++)
1 d" K6 I5 N4 }4 {3 l2 M& H* O    *(p+i)=i+1;
* c: a/ T0 \& h( |/ }. s   i=0;9 L5 i. X( {2 O) n$ f- B
   k=0;
* |5 U/ m2 S+ C% _, o   m=0;3 ^# T( b+ ]5 \7 o4 K+ N' V
  while(m<n-1)
; m6 a; A- A: N9 X  J   {if(*(p+i)!=0) k++;
0 g- s  S8 W3 U' Q; N# q( [, F( ^     if(k==q)+ ^4 |/ m. n: }, b- _- g$ h/ e
      { *(p+i)=0;
% ]( h1 M& I7 V        k=0;
/ P  n- H; e+ F  U' l- V. U        m++;
' d- P8 w+ _- _; m& V      }$ r# {* p% u' [  V
    i++;
" M2 y5 `1 N' i( e. b" |0 s    if(i==n)i=0;! C) o2 \2 R8 C/ S2 m
   }  R& C* k# K& }' \8 Q
  while(*p==0)p++;
6 d( l) n5 W: L7 }2 L# A3 A    printf("The last one is NO:%d\n",*p);* f  I/ {7 O+ `* S, S5 i  E
     getch();% d0 Q: J# j2 c0 l

( H- h4 Z3 j6 ~2 Z" n7 |3 ~3 @}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
# \/ ^7 q# W  t4 cnamespace 又费马达又费电
6 e+ a' U7 l" v- M{
6 l: d1 V% a" A! d: M7 v4 K3 Y    class Program( a! |* V- s& [' j: k3 d- K
    {0 r  F! K1 p- P$ g& W* a1 s( F. i1 m* F
        static void Main(string[] args)2 R: F7 f# K" g) G3 c7 E' N
        {
3 g  m* T/ B  ^, _; G8 ?            int m, n;- v" W  |4 |5 {, g9 [
            Console.WriteLine("请输入数组长度");& p" C2 Q' ~% T" G; b9 y
            m = int.Parse(Console.ReadLine());//m为数组的大小
6 W. R) a* W5 L6 |6 e: H8 I5 _# V+ R            Console.WriteLine("请输入要截取数字的大小");8 f' X) S; @  V  X6 |* X* S% t8 u8 F
            n = int.Parse(Console.ReadLine());
2 f: @' Z/ L4 k4 J            int [] numw=new int
+ ^, i7 F8 [; S" s* `; |
+ [' @; c8 Y; Z. E3 o&shy;&shy;&shy;;/ @' o0 o  N7 z; Y4 q5 t: Q" }
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数) f: T$ H/ F& S, _' L$ _+ w1 `6 y
            {1 N# F: L( i9 ]) S
                numw[j - 1] = j;
1 x- ^0 _' U  A( h( j            }! ^$ ~; C9 k6 J
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!# C  L1 L9 E5 x" }0 `! B
            while (d != m - 1)
' a$ H: O% I, G# ?% @            {
, `" E6 L2 J+ N3 [; j                if (i == m && d != m - 1)) z+ Y! }3 S; a+ s& C$ a5 m) P
                {2 g% t5 A7 r# \! l/ m
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!, K* M* N" G& T) U2 q3 x
                    continue;" n5 b/ f7 v! I) i! N0 C
                }8 }( K' P3 e! K& N( B7 K) y6 `
                else
! [! U% S1 I* j                {
" ^: a& j, _. [/ F  Q                    if (numw[i] != 0)  m5 c3 _! r1 B' n/ ]' [- _
                    {1 U- |1 f' b7 Q4 j6 T0 e0 n
                        i++;1 n/ W- C+ H& Q& i
                        k++;* x( h% \* k4 ]) @5 o( w9 v
                        if (k == n)
7 R4 c. h6 S% f) }5 q                        {
2 `# i, c) R6 Y, K& `                            numw[i - 1] = 0;//把在n位置数组元素的值改变了1 d3 Q1 n5 Y: g" o1 M
                            k = 0;( M. d% F- S1 L" d2 w  v0 Y0 e, |+ W
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
' g$ G/ S- q0 }& {% C$ j, T5 m                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
2 j8 t0 U+ b1 u1 z                        }
5 t/ p+ b3 G' ?$ Z0 h) F                        else//输出暂时还没有改变数组元素的值
1 s5 N7 w9 o' }# |" M: E& f                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
* n8 a1 {* l5 ~                    }) [0 c5 J) |" e3 q  s& N
                    else) n. s& p* G& k) r  W4 D0 [
                        i++;//数组元素为0,直接跳过,不计数。。。
, M+ R/ N" n/ {                }
: m) D- J4 E# Z) t: P0 k
+ d8 f; _5 Q0 g7 k, m: s
/ B) F% U! p" B0 {8 ]* L4 _            }//结束while循环% X3 d4 H! H& g  h
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦! U6 p/ p1 p" C. @
           ; t4 z; T) P7 o0 @6 Z& l6 P8 S$ a
                if (numw[i] != 0)3 A4 L1 R( |3 b/ H+ X$ J5 v* ?- z8 R; B% q
                    Console.WriteLine(numw[i]);
! {$ x, C# |( f           ( T- h1 {% @1 y2 d# G* V6 X! `6 b3 ~
            Console.ReadLine();
7 V8 C7 J3 Y% s% H: m' S" u# L+ l        }& q2 b1 ~9 ]% D* t1 `  X& H
    }  N9 G7 x/ \. ^3 U
}
; w% G+ S+ i8 B/ j/ |
小甲鱼最新课程 -> 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-4-18 20:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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