鱼C论坛

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

猴子问题

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

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

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

x
大家好!- ]" z% k- `% b+ N
这几天我在忙着编一个问题,我用了一种方法编出来!6 I7 e% W8 {' H' s) d  H1 ^) y
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
! y: v% ]; `9 A- _) j注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 + k  s. p1 m9 n  w

- n, R+ o7 z) d$ L
1 n9 E* `1 ~9 }+ j% W4 [: U
                            题目) U. |- t; {& ?2 ^7 T' c# ^" @' I
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
7 s0 T: b; F6 N- K% M8 A第一种方法:利用循环链表
/ K7 b6 t7 x0 ]" p' N& D. n7 T#include<stdio.h>+ Y, `4 B/ l( M3 }, u- b
#include<malloc.h>7 r' L; R9 {% n3 k8 M8 H5 Y
#define M 8            //共有8只猴子. {( t. `6 Z" A' j* y8 F9 m
#define N 3            //数到3只时退出第三只  _' n0 n2 e2 ]
typedef struct monkey
2 D1 O  O" R. R* ^0 Q- e- }9 A{int number;+ T& p$ Y9 c' l: U- z7 V1 R
int flag;$ z, ?: ?0 W) m2 ]) o5 m( {) c, b
struct monkey* next;( i4 t7 w" K9 E! P- b) E& Y
}MONKEY;
4 J* Z9 x( V- J8 ~main()
+ @3 J  \1 l: _2 a7 p' t! L{ MONKEY *head=NULL,*p,*s;( |3 J* j: O" \' g* s2 g/ w
  int i,sum=0,count=0;$ z& p) p. @& g5 o$ j
  clrscr();              //清屏" }8 r6 Q( _+ b' G
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存9 a& l2 B) Q6 f# {3 M
  p->number=1;p->flag=1;
; n. ?' }% A% L) @/ D: }  p->next=head;
" f5 B) m5 g- C7 [( A- C1 w1 }  head=p;: N/ g( H5 F- F# U) C  z& B
  for(i=2;i<=M;i++)
! m+ r9 b. u+ B0 a7 ^/ {    { s=(MONKEY *)malloc(sizeof(MONKEY));
* \! z0 i7 F) V% \+ V+ G1 w     s->number=i;s->flag=1;/ h( o9 k" |8 f
     s->next=head;- ^; d" @9 |6 [
     p->next=s;p=p->next;
2 ~3 r- t% u5 @! J    }
" J& A5 U2 b0 i5 {    p=head;7 W, q: X& v. S- ?
   for(;;)
/ M$ k3 e$ H3 @; a! O  E* Z8 L    {if(p->flag==1)
; i- X! T! v: ?5 y! b! ^0 k3 O8 C# q       count++;- F6 Q  E+ o# o" c. b
     if(count==N)
( A/ |$ w; t. V3 R) P6 w) J        {p->flag=0;/ S( B% u9 m" [; F* L: ~
         count=0;
* j1 @0 @+ Y' c5 A0 f/ ^2 w         sum++;}. J0 I* N3 r5 _4 X& B1 w" p
     if(sum==M-1)" l/ l' p5 z+ h8 T+ l' B7 J
        break;& V2 e& w: ^4 s0 d, w( E
     p=p->next;
6 b% r8 A) \7 N/ ^( Q* p    }+ F. M! ^: V$ `" n1 o; y
    p=
0 B5 r; `% I, {" l. W1 j9 T% k* G    head;8 \0 }; r$ T( |  M, @4 P
    for(i=1;i<=M;i++)- J( j8 G" b# Z7 H8 ?
    { if(p->flag==1)4 b% ~& \$ W# m
        printf("\t%d",p->number);& Z" E) Q) J2 l4 b9 @
      p=p->next;
5 v! w0 W# c! N+ j, D    }
5 e2 J0 C0 }5 @" @  C2 g& l+ V; M, a) w: R+ a

" w( |6 d1 u' ?; ]5 j8 {, G" C! D. L  }6 O- T
}

& t1 M! c& Q4 G( b: Y第二种方法:数组
* ~- X$ W- x# }7 Q+ l8 c#include<stdio.h>
% ^8 @; V$ {& V) g. T: E#define M 8
- c6 \# N6 ]8 r& R$ H# @% Y. E4 Dstruct monkey, |- ?! c& u# f, K
{int number;& H4 u) \* `' s& _
int nextp;" t5 [" }/ f: x  Q5 C: C  ^
}link[M+1];
5 ?9 H( A: [$ Z0 p9 j: d7 ^0 {
& g; A, i7 W+ Z, Svoid main()  c* u! B2 q" p2 n0 M8 X
{int i,count,h;, S- i' }* ^  i" I) S. X
for(i=1;i<=M;i++)$ p9 D) x( F/ H: g
{  if(i==M)
9 M& {0 R" n3 j! H1 ?0 a% \   link[i].nextp=1;: [9 n$ p7 i& I. _# C
   else0 G" Q+ T. z. b. C) r
   link[i].nextp=i+1;
; ]- V5 H- t8 I4 F% }  link[i].number=i;  k* V1 o6 P& c3 F' Q' a
}3 ~# l5 S( L7 o* c+ ^- }
printf("\n");: G. |# F0 A, g) V1 G" N& G' N
count=0;
0 ~. @' t/ a3 Ih=M;
1 j  E) F1 s# H/ a7 M7 m2 Dprintf("依次退出的猴子: \n");5 s& R2 x% b% p
while(count<M-1)
% Z+ X* b% i; `3 Y{i=0;
& H$ W* c! c6 I/ d( H; _while(i!=3)
, s  v1 K9 V, e) ?5 P3 E3 ~{ h=link[h].nextp;# U, A; |) U  K+ I1 E: C; ^
   if(link[h].number)
# ^; p* J; _, E     i++;}" q) P( `: {3 v% Y

* }6 P! O4 Z- f) z) `6 ?: rprintf("%4d",link[h].number);/ u  }9 k; C% M
link[h].number=0;5 q( O* z7 ?+ r2 K/ G" J3 h+ Z& F& s
count++;
' k7 A- r+ L0 S$ f$ e! O9 U5 n- ]& H}$ L& Z' U: k  f* f# R+ }# d
& u' Q# H, O2 q
printf("\n大王是:");+ `5 @6 v% D6 @6 b/ h2 {$ B9 W
  for(i=1;i<=M;i++)2 ?) }) l( O% g
  if(link[i].number)
% C1 G2 o( m% S4 B# Y    printf("%3d\n",link[i].number);) {2 X& g9 i# F0 ]+ I
; P2 R* `* Y3 B$ k; ?
$ M) J3 f9 k8 p
}
; r/ \% J# h( a, h' U" m
第三种是普通方法for循环
5 R" B* [6 a0 Y3 p( d/ f; y6 d
#include<stdio.h>
: u7 W* B1 o0 m" b% tvoid main()# c) z+ z" z5 C
{ int i,k,m,n,num[50],q,*p;* u9 g( o5 x' O. E+ Z, q
    clrscr();
5 ~1 \. \! w3 |! L4 y3 I- H   printf("input number of person: n=");
. c& `1 E5 i. z7 P" G) d4 X    scanf("%d",&n);
! E3 @, V9 n) l! b* _6 }printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
3 M8 e4 Q2 [5 `4 N    scanf("%d",&q);
- z- b) i. Y) e7 z- H8 b   p=num;% p* L. ~. A: }: l* l/ k+ B* W
  for(i=0;i<n;i++)
2 f+ m. d. v1 f  ^7 m    *(p+i)=i+1;# D6 i' `2 T$ W2 `; N" S
   i=0;3 o$ f* {2 o9 _7 r0 N% t3 J
   k=0;
1 _+ q$ i( _0 e$ h, D3 ]- `   m=0;% o0 ^* D# J* I) A
  while(m<n-1)5 s0 m* g: M% k) S2 P
   {if(*(p+i)!=0) k++;
, B7 X  E# D3 ]1 F4 [5 j     if(k==q)
0 H. \6 ?2 g( V( n/ R4 l      { *(p+i)=0;5 {% Y) E& W: K9 [1 S9 i7 E' n
        k=0;0 r  ^9 f& D7 s! s0 f; k; d# O
        m++;
: g7 t# F' s% _: H( c' G8 M      }
% G  x+ O/ v1 |4 o    i++;# G& U$ {  e. B9 a8 S
    if(i==n)i=0;) M# M: c: S( ~" p
   }
. v6 R6 [, N  Z. R7 `/ U  ]  while(*p==0)p++;
8 \5 s5 {5 ^2 M4 V7 f% p! C& _    printf("The last one is NO:%d\n",*p);
. C" [/ z5 I2 H! B3 W- x     getch();
5 H. d/ r8 E! N% v9 f! |# ~
( w  g3 k6 w4 Y}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
" ]. o. g8 n4 O& z( f  m0 Vnamespace 又费马达又费电6 t4 A) v$ T6 y& F& P0 N: K
{
+ c0 O$ [4 p+ R2 Q6 h    class Program
/ }7 \6 x2 f! d    {
3 n# a- R# `$ q, a/ w% v) m& u7 D6 c5 |        static void Main(string[] args)
5 p. `# ]% m, `, ^# \. D1 E/ d, G6 w& L        {8 S0 ~. |0 ?6 ~4 Q1 N
            int m, n;9 @# f8 R# w- ^5 m2 K
            Console.WriteLine("请输入数组长度");/ h1 c, [; u) J; v* i
            m = int.Parse(Console.ReadLine());//m为数组的大小! C7 @/ Y$ a( z5 G0 y* N* c% Q
            Console.WriteLine("请输入要截取数字的大小");
8 Z; N. d. l3 W! C. i  k+ O            n = int.Parse(Console.ReadLine());, W$ h# @& ?/ n) S% [  w6 x
            int [] numw=new int
) ^& `+ N% Q# g! q6 Z% G
) x' M3 I- X6 `; O  X( g- O/ o/ S&shy;&shy;&shy;;" y5 A* ~8 w8 y# }/ W
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数" W' b. `6 y) t2 F, m
            {) b$ e4 @0 `0 A, W: |7 x+ L1 k
                numw[j - 1] = j;+ q% z/ Y& {$ U4 z7 Y2 R5 N# \
            }
4 r+ @* ]0 ]2 w* Y% a' e            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
# F2 y$ i# A5 W' e, r' s            while (d != m - 1)
& |; k9 \- ]  Q            {7 _4 A3 B+ E. D1 L
                if (i == m && d != m - 1)- e; t2 l, k% d1 k! j2 O/ |4 k
                {
7 l( R& c# q, f) K: A/ P                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!- ?* T# S# M: g7 B- F# g
                    continue;
2 \" R. W4 ?: |# _5 a6 @' t                }4 I0 u0 i) u. ^
                else
/ H. A2 l: R, `% j1 Z                {
5 b% `( r7 m+ K! Q+ p. v2 T$ M* f                    if (numw[i] != 0); t. E  x, i* C8 ]9 M/ }( N; M
                    {
3 p! j& s5 E+ \0 J& G) h3 a0 x                        i++;$ X' b9 `9 q$ h5 Z8 N( M
                        k++;+ M' E7 B/ J; [+ A1 f9 N, _
                        if (k == n)1 L7 k% e6 l$ o" B) `
                        {" I$ N% \, M" n8 o+ X0 Z7 }
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
! u# D+ ?0 `+ I9 \                            k = 0;
' u% Z1 r+ |6 W              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1' i5 f( @9 w$ O* y; H% Y4 A/ I
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);3 h8 h" B. j, J$ M  f7 k
                        }2 E) A; k0 |7 k) _& L
                        else//输出暂时还没有改变数组元素的值
1 O/ M8 X3 C5 B/ N$ U                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
$ @9 s! E: B- U6 m                    }# B( D% U/ ^, u  d; a9 c
                    else
, u5 i& \6 P( O" A! V% r! X                        i++;//数组元素为0,直接跳过,不计数。。。/ T" P* r9 a3 g" `; h
                }& p1 s% J7 k2 {$ N2 _
% Q3 F5 Q2 N' U+ V: a
5 C2 D; F5 w9 l6 |
            }//结束while循环/ x. {- ?; d+ Y  d
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦" D4 h1 m7 `: k$ f% ?# x
           ) R5 u. e! j7 m2 e
                if (numw[i] != 0)( j2 ?! Z2 A- r% R; |& S8 X9 h5 [
                    Console.WriteLine(numw[i]);7 ?2 k/ S. J' V  K' P$ T; f
           
  ~# {/ g" T( m9 [- Y5 f+ l            Console.ReadLine();5 V9 y% Q  v- u# A, w9 ^
        }
5 P$ d& N, v  t# f1 ^  Y% k    }9 q: [; I" p0 o9 q  ^* o2 _7 l
}
0 G* j2 p% L. S& o  `! o
小甲鱼最新课程 -> 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-8 22:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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