鱼C论坛

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

猴子问题

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

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

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

x
大家好!
5 W1 k6 T) e3 N& R% c# y这几天我在忙着编一个问题,我用了一种方法编出来!' x6 L, T1 X: P. s
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
& }' Y5 h6 i$ r! I$ A( F6 k" I4 J注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 , W! ^  Z$ ~7 q9 G2 ?: F

" F) P) S  t. @4 P. b/ R: Z+ t0 O' i6 F+ K2 P9 k% T
                            题目
6 p8 j, l) ^8 @) m2 N; R8 ^山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。  [2 b( a7 ]5 d* |( ]- _. @" [1 Z% L
第一种方法:利用循环链表$ {  Q' X- S% U/ a! |
#include<stdio.h>, X9 \2 X* Y/ z/ {/ j" m
#include<malloc.h>% T, f! A! N$ I9 q0 i
#define M 8            //共有8只猴子
! f# e7 S7 T0 w# R#define N 3            //数到3只时退出第三只% N4 ~& O8 _) Q* P7 g
typedef struct monkey
+ g; i" [. A4 x% b4 v7 z8 Y3 s{int number;
$ p& c4 {2 _* e! l8 }) Fint flag;
/ p4 R8 j9 d  q& F7 Z6 E; ustruct monkey* next;2 W1 h5 d0 i) S/ g8 t. T
}MONKEY;! d: d2 G4 w1 w8 p1 g
main()
% U+ n0 h3 Z2 t7 F  N{ MONKEY *head=NULL,*p,*s;9 d$ U: T, ~0 f) \6 A; M
  int i,sum=0,count=0;; P. z3 d1 `4 D6 J/ I
  clrscr();              //清屏
0 f8 u( k: ~- p  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
/ I; o" N- V4 O! @, U4 U  p->number=1;p->flag=1;
# @* e' `5 p1 B  p->next=head;" Q3 A+ O4 I$ T+ L6 p
  head=p;* w: V3 t( {0 b: N- F( v
  for(i=2;i<=M;i++)
6 T" s- A1 N* X! g    { s=(MONKEY *)malloc(sizeof(MONKEY));. Y: o; T7 v7 v* J7 ~5 J0 @
     s->number=i;s->flag=1;1 [" R9 w# t- @
     s->next=head;
4 t& ^) \6 B% w: W$ k     p->next=s;p=p->next;5 g5 l) \/ Y: F+ e$ J" O
    }
8 z: ]6 ?+ w7 J- r$ Q    p=head;
- J4 x  S& z7 O+ k   for(;;)' N4 E- y' b1 j. `6 _& `
    {if(p->flag==1)! w* a3 O% c3 i6 h9 v  s8 ~
       count++;* G. q4 D! |" R
     if(count==N)
2 f6 J- E7 n+ m1 H        {p->flag=0;, w1 {* N1 B( b2 l: S$ g  ?: E
         count=0;
( Z* f7 ?1 t5 [         sum++;}, n. |& p5 s# F" b% j
     if(sum==M-1)' o1 Q- o" @0 ]1 T7 Q: N! O
        break;  D  s! x% J  N1 \
     p=p->next;. b$ j3 c) t" R/ A" _1 K! S) o- t
    }
* |. A, c, E, S2 K" X/ t    p=) n/ n, t5 Y4 f) n
    head;8 p( _% V$ d3 j; ~% r) U. H
    for(i=1;i<=M;i++)) x7 D* _/ n6 }- }1 _/ ~) l2 O
    { if(p->flag==1)
  o) I1 U" v7 l* w  O        printf("\t%d",p->number);
* ~/ }" w; s: I0 P5 H- t( I, f) A      p=p->next;
$ q, I5 F. {$ w/ K7 ]- k    }& I8 G: }% v- q/ W& @3 R

6 c- }( f% T3 E0 ~) _
" y1 l1 {1 N/ C4 H" ?/ P
6 X) J/ R/ u0 k1 z. V, @}
" t" K' N$ X) }1 D
第二种方法:数组
$ _6 i3 R" t$ q: n6 ~8 j#include<stdio.h>. f" M/ W: b4 B  K4 E+ E# s
#define M 8
! Y  o5 I* _" \+ Y! m: Bstruct monkey
/ s: p: I8 k# z) b; l{int number;
7 X3 U. N& {" z* v" ~0 `int nextp;
/ Q7 `. u$ o4 I}link[M+1];! J' M4 u2 t$ G. q2 t  S
8 e2 i* C& Y4 {7 `: ?2 n% o8 c3 o0 R
void main()
( @8 }# P6 {" _! g( \{int i,count,h;
% }9 c" }  _8 |7 Q" r$ M% ofor(i=1;i<=M;i++)$ ]9 [1 }. I7 O; ]3 K: {
{  if(i==M)4 s' A9 T& e5 U# ?
   link[i].nextp=1;$ A% V% W' i. K" Y
   else3 x3 Q% D4 c7 u* X/ _3 }& _
   link[i].nextp=i+1;
1 g+ D/ A% C4 H" ?6 g! [  link[i].number=i;
% e. C2 }/ j8 }* ]- T% Z4 m}
# ?- N. _9 L/ v1 Xprintf("\n");# I8 \1 B  J( |  H
count=0;. ~5 ~: w) D/ L! _
h=M;* z8 X: V# \& Z8 Z
printf("依次退出的猴子: \n");
1 F, s+ F; d0 T' T4 G, T+ ?# mwhile(count<M-1)
1 k9 o# k3 S0 X4 J2 }( C{i=0;) ]# }5 h# G: m$ f' W# Z
while(i!=3)0 v8 |0 @" {& Q1 g! G8 G
{ h=link[h].nextp;1 W) W( ]" i6 c+ E) s6 p- U& [2 x
   if(link[h].number)% s4 I9 \: N! j- G
     i++;}
+ I# B$ e# ]% B4 n" ]; W
8 @: ?- s$ [' p' i+ M5 J% s$ oprintf("%4d",link[h].number);7 {6 a# Q& [$ _) g* B
link[h].number=0;; i/ j3 N; _& D
count++;% F6 X- N0 N$ }. ^5 j6 J8 m
}
2 ~1 \' b5 v& p0 r' g1 M
" D& G! j0 ^4 j# {9 P, F6 x- U$ Uprintf("\n大王是:");6 @# L2 f( x4 i# W- E7 D
  for(i=1;i<=M;i++)
( V. x7 E8 R$ `) p1 f8 R  if(link[i].number)
% o- ~% [& A% A    printf("%3d\n",link[i].number);# L: V5 \7 N  |; I9 z
( C( M! o9 `- W( t( \- i- \; K# f

- m* a6 \: @0 g; U& f" t2 h! `}

( d& z( m% @1 I7 `第三种是普通方法for循环

2 _- W  t: a( C  z6 Q#include<stdio.h>* h2 }( `& f& Y8 L0 f# }& F5 d  {
void main()3 t& e) s+ I2 U- ^/ {5 Z" L
{ int i,k,m,n,num[50],q,*p;8 A: v* n0 t7 t: {( q$ D0 h
    clrscr();
: |* ~' c, g' q2 t$ \   printf("input number of person: n=");
* B. h9 K1 r" C) b    scanf("%d",&n);3 W; c9 u" p; `7 E: `$ r1 j# x# A6 I
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
7 @+ S% G7 |/ |0 _3 c    scanf("%d",&q);+ Z. x" v- B) i1 A+ e6 k
   p=num;/ E  T! p% w3 b  d# E+ P
  for(i=0;i<n;i++)
* G+ S* K% l. p' s& q; |    *(p+i)=i+1;
; X. ?- f0 H9 X1 G" \0 {3 U/ K( |: ~   i=0;) \5 C$ v4 [( t) K, a( A  `
   k=0;
, m4 o5 D# n) }4 ~; {   m=0;: ^4 ^% g% K4 Z  g; n; q, d
  while(m<n-1)! B' R) [: I! m/ @- a, d3 e
   {if(*(p+i)!=0) k++;* S$ s9 Q' S( S# Z% t& _" h
     if(k==q)
, D) |" ^* l6 O. T      { *(p+i)=0;
+ d' Q0 E" V$ Z        k=0;
* L$ S) R: d4 U9 S        m++;
7 O0 Q# N5 G  c) z5 |- i" X      }
9 e5 x+ P+ f! A6 A5 r# R) b    i++;3 p* ~8 t- V; _/ y& P1 o8 _
    if(i==n)i=0;  \# u( K8 R  c) g, \5 }
   }
4 q; x6 ^8 @5 r4 t  while(*p==0)p++;
# [7 T% l, N% `3 E. J    printf("The last one is NO:%d\n",*p);
/ E+ `& Z3 @6 `# k     getch();: n: M3 y8 ^3 I' p  X
6 M# f# n6 @& f
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
4 u9 v9 k& e2 d: g3 ?+ ?% c+ `namespace 又费马达又费电8 d" I% X( m  L% n" T5 D
{' f& l  U) ?2 o. G" v1 ^" \
    class Program* x* I) j3 W, I! [6 w! T
    {
" Q& G* p2 w& V7 ?, b        static void Main(string[] args)
5 U* u" _% y6 R/ c- ~        {1 y+ k, F7 ^4 s. R, F
            int m, n;
+ ~4 m" X3 J6 e! y, d, ]+ r& S            Console.WriteLine("请输入数组长度");
" Q4 V, n/ }0 t! r            m = int.Parse(Console.ReadLine());//m为数组的大小
# z1 e1 ]( M. n# y- L1 t+ F            Console.WriteLine("请输入要截取数字的大小");
, o( d* X! z5 @8 t. E. ]+ r            n = int.Parse(Console.ReadLine());
0 W+ h5 d0 R$ ^1 R            int [] numw=new int! P4 w$ S) [8 I9 b  U- x$ F; |2 w

" R% ~7 ~, _# G5 a, I- L&shy;&shy;&shy;;
8 p* v2 T+ u$ I* A! }) P            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
1 v* Y" d8 X8 k            {/ s: ~4 A& ?# B, d- o4 g3 ^8 _7 Q. w
                numw[j - 1] = j;& D/ t. [5 e1 j  _: `
            }
9 y" ], h7 _3 d2 K# U7 }# A6 O            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!: S. S2 X! ]; u+ c( T2 f# G
            while (d != m - 1)
$ q: w( l& ?6 B- N* C8 O, E            {3 o# ^5 b. {- y4 V5 v- J
                if (i == m && d != m - 1)
- m! _( ~/ A( g2 z" }# v' F                {
4 h9 L( [: o4 U) X- b2 f% l) G                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!5 Y% [( e& m* ?# r  |
                    continue;
4 V4 g$ f# n( j) J4 P. w8 J                }  z9 ?( |  E4 h8 y
                else+ D) K/ _$ }- l' N4 @
                {  `+ J2 W; [% O3 m; L
                    if (numw[i] != 0)
4 T" S( o; ^* s2 d3 P2 U8 h                    {% L" {, k1 u1 W* c; u2 {
                        i++;
4 f. j: B9 S( Q- t3 }                        k++;0 ?# k& K7 n" A% K3 u0 F( {* R: t
                        if (k == n)9 C& M' {. `: S  c. w
                        {
3 }- @1 M6 t* H/ s3 a# W                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
2 q& o; y2 D) ^2 O                            k = 0;/ Z" L5 o. Q2 J' m+ F( {
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
2 ]' ?! z  X  j/ |4 L, ~                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
/ |* t8 a& T& o) V3 T; `                        }2 V& s+ i4 o2 l
                        else//输出暂时还没有改变数组元素的值
: j. o- R6 {( Z1 [& v. \: O                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);: V5 d1 [& p; y: P1 H$ m
                    }
8 a2 ^. n4 i- Z4 C                    else
- ]. I. k5 Y$ Q# t! R                        i++;//数组元素为0,直接跳过,不计数。。。) t4 {1 U; o) Q1 ?6 k
                }
: M7 o7 N* e6 X" V
" \% H, E: M: x% C2 }5 r" h9 J0 u9 @1 I" J' M6 B5 n
            }//结束while循环- @# Z7 ]5 ?" x2 j* \" V1 l
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦# T" `0 D# C* z5 a7 I
           
0 |$ G, S5 L! k' z' u                if (numw[i] != 0)
* e; ^7 [$ u% |+ a9 T: K6 G9 a& R                    Console.WriteLine(numw[i]);
' O/ {; X" A& p5 E# G% z6 U# R           
: ?: u9 J, [# X8 U5 @5 f: w            Console.ReadLine();7 h8 `* W6 j$ T
        }
4 Z3 D/ r5 \: r  P    }. g7 s( H4 a  K% X* l1 Q/ y
}& E. F* o8 P1 \3 }# h; h
小甲鱼最新课程 -> 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-7-20 10:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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