鱼C论坛

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

猴子问题

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

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

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

x
大家好!5 q# U2 O( p. {& m4 ?8 T4 J* m; y
这几天我在忙着编一个问题,我用了一种方法编出来!/ s* U  O; B4 S: U- {# ^
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!( q  N0 z2 s. u  y5 ?" Z
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 % ]$ c$ u9 g- K$ @

, J; q! T1 I* f( j7 Q: a& i+ U1 H. E% n
                            题目: y- }. j( G" i, T9 l" ?9 v3 F
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。+ t6 \' I4 D+ X- x( n+ b; _
第一种方法:利用循环链表  h2 c/ n; G" Y  L! E
#include<stdio.h>
7 H' L# B* i3 Y" F7 O- ~#include<malloc.h>
- y  d1 V/ L5 r3 o3 Q+ N#define M 8            //共有8只猴子* H- ?* g9 u& T; @9 z  L# q
#define N 3            //数到3只时退出第三只
; b4 j8 G+ _3 X$ ^" Itypedef struct monkey9 j' h$ n% K8 y% `/ X
{int number;
6 y  ?; B" ^5 a. F  O. ~6 f0 m' Mint flag;1 g1 q0 J2 U! w+ Q# `4 f- r
struct monkey* next;
" ?! J* h. P8 o}MONKEY;
( g+ x$ b' }7 A7 _main()
& |" |& F! }& O# I8 g{ MONKEY *head=NULL,*p,*s;
: n2 k) |9 X, D6 q# t* ~  int i,sum=0,count=0;8 B( `  G: G9 i0 {2 _0 R
  clrscr();              //清屏- ]# R0 m+ Y1 b( E4 t3 i
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存* s' b* y9 Y9 a5 N
  p->number=1;p->flag=1;
# a* C! f+ A3 m  p->next=head;
1 ~- @( K1 L5 i) r  head=p;
) V! n; p; ^$ G- N. @. t  for(i=2;i<=M;i++)9 C$ j% Y( [, x- ]
    { s=(MONKEY *)malloc(sizeof(MONKEY));
; F$ G! K; r! v* e) a$ B0 ?     s->number=i;s->flag=1;( A; q7 D) n7 _1 \
     s->next=head;
, E/ v& J# P. a% G- }/ C# Q& S     p->next=s;p=p->next;% _4 W9 w$ w7 A: _
    }8 a5 z7 |$ B2 D# s
    p=head;
% r, T" M. d" g$ N2 R   for(;;)
' x# b* n  W; @! r    {if(p->flag==1)
* _; ^) B+ x: U0 D  B5 e$ x" E. c       count++;
7 J) Z" `! h& N3 n. ~     if(count==N)
& G! ?6 l. _  {- z- K$ ~        {p->flag=0;( K2 n- Y& W2 H3 E5 p
         count=0;
  @' g) ~3 u$ C. N' {         sum++;}% W+ V) D! f7 I
     if(sum==M-1)
& X7 Q: m% F* s/ \" D2 l        break;
. [: o( t" ?8 z6 r( T" h/ ?     p=p->next;8 M( m7 D. F. q. ~0 i6 ]
    }
3 ]+ O2 f7 f5 p* T0 }/ M* Y    p=3 f5 @% x+ d7 H9 E2 O/ `
    head;
! d* O: [! M0 T3 }3 n2 p! p    for(i=1;i<=M;i++)
1 r' }; b# m. R8 N% ~; Z; d    { if(p->flag==1)6 d' K+ s2 G) M/ ^" |  j
        printf("\t%d",p->number);1 ^. W3 A, w( E) z! h/ }
      p=p->next;
" p& L/ z* l) N( ]# a    }7 C1 E5 J( H" y8 Z2 _& |, O% \4 y5 {

7 ^  l7 [, F" P) i- U3 Q' t- V. e4 x

, B) `$ ^0 l3 P$ \( Q/ w& v8 M}
( t, O" ~+ q6 \4 I2 q
第二种方法:数组) p# K- j7 B& }) `) i
#include<stdio.h>; N% c/ r1 {% h; \- [" a( |
#define M 8
$ k1 ?9 ~2 Q2 O. Xstruct monkey
; x+ W$ x) Y) P  j1 R  L9 f{int number;
8 k/ W" G' s: a# `+ I- Aint nextp;
: B% T' T% k! ~# d/ [/ e7 t}link[M+1];
1 B! }- ^+ _& H6 R
3 b$ q, j: Y, Z- B# Q4 ]void main()
7 n% v$ H1 L+ f) |1 {{int i,count,h;& I( H7 x+ m' Y- y$ J/ U. T
for(i=1;i<=M;i++)
( a7 [( G' J- k5 I{  if(i==M)* ]! o8 q6 x: O3 f2 y# z
   link[i].nextp=1;
$ V7 d1 Z# e3 j4 s; w0 j& v. K   else2 d% E1 M2 }) T/ @4 F% q0 j3 g% o
   link[i].nextp=i+1;+ C3 i% O3 {5 t) B( m' D
  link[i].number=i;
5 Z- R" Y* s2 o+ K+ u! K; u2 P7 \! R6 D}
( |6 t  U( w. Q9 k5 Aprintf("\n");
  @9 y5 m; C) r' l% Lcount=0;' k! g9 K; c4 `5 Y( F% z5 }
h=M;
0 L% N, M0 ?) F6 H8 Kprintf("依次退出的猴子: \n");" m1 O, j2 |$ k  [, [) D
while(count<M-1)6 ?% ^& ]3 x2 {/ m  U
{i=0;5 h6 S1 C4 t4 ]
while(i!=3)
0 Y' u) q  H8 w& k. K{ h=link[h].nextp;
, }; V7 G& L$ W   if(link[h].number)4 [6 o4 Y7 R& M. ~4 i
     i++;}
: J  H8 i8 D+ A- A( U5 ?3 X% N1 \3 f% ^0 ^. i/ Z4 y( G( b0 T
printf("%4d",link[h].number);
8 l5 L; \1 d- y8 P4 F- Ylink[h].number=0;! U/ h1 }# V3 r* @8 Y
count++;5 ~* J0 |: w& d+ t* g* a! l
}" N4 ]% q% W, Z% c  U: q
& ^9 ]& ?' ~/ w1 v# `( f
printf("\n大王是:");
8 m- x, D& @* x) ^* g5 t+ X: b& q- P9 q  for(i=1;i<=M;i++)
. l1 o/ R8 u0 E6 T( t" w, h& P  if(link[i].number)
+ @$ q7 t# e8 |) c    printf("%3d\n",link[i].number);
* K7 n8 K9 M" C' r3 }6 g5 U0 @0 S5 ~6 n, G! ~, n1 N/ e
6 n, q9 q0 |* i2 f
}

( J/ T, w- A$ m& g7 t: a第三种是普通方法for循环
( L9 m/ w  q! C: n
#include<stdio.h>
4 Y7 H8 f9 T2 @( Vvoid main()& U; A7 Q  Y0 E5 f. z
{ int i,k,m,n,num[50],q,*p;9 J' r8 G# l9 R. z
    clrscr();
) c/ Q4 d& d7 G! i! p' f- t* M   printf("input number of person: n=");" W  `& e2 X" @7 A" o1 y' q5 ~% P
    scanf("%d",&n);
8 @' I$ ?( s. r- t! ]( Wprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
$ H4 }0 T! y: n' v4 s6 N- J    scanf("%d",&q);
/ G1 ~5 ~8 N6 I, [   p=num;
2 t: H1 J- L, A! b! O  for(i=0;i<n;i++)( k1 F" o1 J5 }  [" h
    *(p+i)=i+1;& o" F4 e$ C  D8 y
   i=0;
* P7 {2 K/ W& k# A$ @1 @6 u5 @   k=0;
! P2 W- k9 r5 d( T. P   m=0;; Z& Z  Y: o( I- S' G
  while(m<n-1)1 N/ N  X, s: _4 K4 G5 I5 w5 f
   {if(*(p+i)!=0) k++;
- J4 K+ }. `4 i. J& ?2 h     if(k==q)
5 @; a" W9 r; Q      { *(p+i)=0;
* F8 d/ u6 m! x6 Q        k=0;4 p. `, I2 i% k2 v4 T! D
        m++;
4 Q8 M. Q; s0 z% u; a      }
+ `; c& ~# u7 ]8 v8 _    i++;$ ^0 @8 e( S" ]" ^
    if(i==n)i=0;2 k. }! E8 c& `2 ?/ \
   }! l. L1 @/ g: Q1 z  ^9 m/ J
  while(*p==0)p++;
% ]& H9 W: G- |! L  k4 [    printf("The last one is NO:%d\n",*p);
+ g5 w; y3 Y* F+ q) r6 f     getch();/ a$ N( z5 _2 s. b! p# @

! ]9 B' C6 y: k- E# [}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
/ N+ N" d& m4 lnamespace 又费马达又费电; [1 B& _  p, E
{) ~) l! e! S* K1 k( I' k3 E
    class Program+ o4 f# e0 u; e
    {
& T! c6 B5 \6 ~% D3 x; r3 o5 K        static void Main(string[] args)7 S- A" H$ U1 B, B( G
        {* ~1 ]# c+ T) F; ?( ~
            int m, n;
6 L% i5 k7 v4 h; D7 V( E1 C9 l            Console.WriteLine("请输入数组长度");
( S3 U3 o# V; i2 I& m3 Q/ [% [4 U# g8 v5 I            m = int.Parse(Console.ReadLine());//m为数组的大小7 ~( @* n, L9 y3 B* S; ~+ c% d
            Console.WriteLine("请输入要截取数字的大小");4 ^7 Q  u0 e! |  j0 e! H
            n = int.Parse(Console.ReadLine());3 ]' c4 C/ o5 M8 g: x* A! k
            int [] numw=new int
5 g: t" E8 E! t$ M1 ?; [( D' C; C/ J8 W' v: H, X* }. k& {
&shy;&shy;&shy;;
2 p; v  n$ |' ^; q            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数1 P3 m* t4 q% p' h" a9 ]
            {& f, a2 z2 E: |% A' J
                numw[j - 1] = j;8 l' k( H& {0 g- A
            }
6 ~; f9 ^- K- g+ L  ^9 e. A            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!$ O8 f) [9 w' ^2 l* Y
            while (d != m - 1): O0 g: K# s7 d- M& P
            {0 m9 {9 h! F: a# h) ^
                if (i == m && d != m - 1)
5 D$ a1 i+ c. L                {" x% L+ a  H/ x, Y/ X  j( b
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
  a. B. e# e, d                    continue;
0 L" E$ g" K; h( k8 k                }
8 y4 ~/ f2 S; i                else" c0 f/ P) J1 q
                {
/ s' }2 V. ?2 ~2 V& x                    if (numw[i] != 0)
4 I4 c; V2 s$ _# e5 v; D                    {
5 E! o' v; |9 I8 J9 @% q2 k                        i++;1 P" |) d$ r# \  _/ f
                        k++;5 N, a/ H3 B! a1 ]. q: e
                        if (k == n)5 s# ?- r, B* b. D0 X
                        {5 W, N  g3 n# r, w
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
* R7 [3 X, K& U  p, `# j* {) l  c                            k = 0;
7 x/ p, Q( G. h              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
' F9 ~  D5 @# V3 J+ Z                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);* }4 r4 G& ~) ]  i& K
                        }
6 @! [; G* @3 `( h! l  |                        else//输出暂时还没有改变数组元素的值* t! V* t' M% W4 L; c& }! s: G- W
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);# v% U& |, D  g7 V# E5 [( ~2 z
                    }
" w4 U1 F$ O( m5 L7 l) @                    else
; x6 f9 O: ~2 B) X+ N% v                        i++;//数组元素为0,直接跳过,不计数。。。/ F1 r& w0 Y9 Q% W4 R: R) m
                }
6 y! K8 L% T4 |, M& }8 O
+ Z+ X' o) L- ]! ^+ j" {( K" d# r9 i) N$ Z8 f+ z4 ]5 t
            }//结束while循环& ~8 E5 ~* K8 ]8 ~, [
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦2 }7 D6 _3 X+ K5 k& }4 {! S
           1 F+ b& @- Q0 a7 u8 n
                if (numw[i] != 0)
# a5 u. g4 z  l  E$ D; D                    Console.WriteLine(numw[i]);) s# F6 f4 Q3 ]& t' q; A
           . e7 F+ f: O& M/ ~6 y! `
            Console.ReadLine();6 D6 z! t# X6 w0 ^( ?+ b# J
        }
6 g* b. m: t% h* @# W8 ?    }) U* b+ U1 t+ V1 {/ U
}: @9 a0 e+ e' u2 L. N! e/ f4 F
小甲鱼最新课程 -> 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-2-19 01:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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