鱼C论坛

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

猴子问题

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

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

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

x
大家好!
  z& u" F8 F+ v/ b! B7 m这几天我在忙着编一个问题,我用了一种方法编出来!
9 Z7 C8 i4 C. ?: H, w+ r" ~$ R但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
1 V, `0 \3 R8 N  j8 _& p' w4 p注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 & Q2 R: B5 j& p$ r) n7 K
; z& V4 k' `& Y  u

$ j/ @% N$ Y. C7 D- v6 E4 r
                            题目, @; D  x5 H, k/ I
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。1 Y3 P$ h; ]) `! `* O$ ~, I
第一种方法:利用循环链表
" i* Z6 `) h; p! J4 u7 j#include<stdio.h>" p; g( W; r. a  Z; z. ?8 n
#include<malloc.h>
" a1 P: c1 j2 @/ y3 T' Q% g, J' F#define M 8            //共有8只猴子
3 |% N: p/ P: y" N# D#define N 3            //数到3只时退出第三只
, V) e! t- u) a$ ktypedef struct monkey
) r: |& H5 G% F) {{int number;# k! s2 A* A% X0 ]" {; f6 |8 L
int flag;
( _9 }8 B6 q& }3 }6 ^0 Cstruct monkey* next;$ C' r0 ?: X- c+ K* T: W% }
}MONKEY;1 Z( i* i* H8 W6 @# N6 Y
main()
) R) ^; b; i# P% L4 o1 H4 q{ MONKEY *head=NULL,*p,*s;
" Z% {8 K8 Q! Z  int i,sum=0,count=0;
$ b. e( L! u( d" G3 O  clrscr();              //清屏
- b% J9 [- b7 j. h  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存/ m' ?; |2 S1 Q/ g' q
  p->number=1;p->flag=1;
! \7 H) i# N% @" [  p->next=head;
. n5 d. F& ?& `  head=p;. e. w9 E8 M, i7 i
  for(i=2;i<=M;i++)% [( m) [& w7 `9 |5 A7 v
    { s=(MONKEY *)malloc(sizeof(MONKEY));
5 [6 r# l8 U6 \8 Q     s->number=i;s->flag=1;
/ _6 T# W4 q! N0 G& r: j4 a3 I     s->next=head;# W( `. p" m7 k$ ]5 W8 X2 X9 ?
     p->next=s;p=p->next;5 f$ Y) e8 l* u! y$ J: U8 c
    }
/ G; d1 R8 }& j9 Y    p=head;
% {, t6 Z; P3 v1 l6 w0 Z, ]9 i   for(;;)
, `; L# G5 M, I$ W( f/ j+ ?    {if(p->flag==1)
) I- L4 f. {) M# r4 @- G* V3 w       count++;
$ j3 z$ c3 H7 o6 W     if(count==N)* v( o* e4 p! E! @% E
        {p->flag=0;
, \9 ?& h# |; T         count=0;0 l% A$ i0 R7 p) f) F# u! P: ]6 q
         sum++;}
8 g( A( ^1 Z) u2 f4 c     if(sum==M-1). |, n' T2 \! A+ o
        break;! `7 g% |6 J5 C  c4 X
     p=p->next;
+ M6 g4 ~8 L+ ^# b! W1 b4 N3 e    }1 x* r2 i$ _  i3 H6 @6 v
    p=
# v  ?# Z9 g6 l& @+ B; @    head;
. A* j. k9 y" }* d    for(i=1;i<=M;i++). E2 j$ H  A5 a& w2 ?, b
    { if(p->flag==1)' p1 g, j% J4 ?. f
        printf("\t%d",p->number);( o3 T7 T* u1 I4 N2 n2 E. s. u2 Q9 s
      p=p->next;* w- Z8 O4 d, O7 @  O
    }
+ w. L; W. H. c
# W7 w3 v5 _% B3 w2 q
5 c* [" Z8 W3 `  k; q( Y) k- \) M, l5 S8 A0 @+ J
}

, {( {5 }1 |. Z3 `0 W  e( X4 F第二种方法:数组
3 |4 _/ H' I$ a8 n- z+ c#include<stdio.h>; e2 }4 |2 _2 @% {
#define M 8
5 Q  w) ]/ n; ]4 Z0 Fstruct monkey
8 m# U* |5 I" `. |; A4 {5 H{int number;
7 `! ?* ?; f% U, w$ Lint nextp;
  S0 f1 _+ \/ ~/ ?" \}link[M+1];- A/ o' c: C) @- z% K8 t" x

/ |, J- D" q/ ^; _% }void main()9 l* G2 T" s9 A( W. r% J
{int i,count,h;
( w" v$ J. t6 M9 U8 \+ ^for(i=1;i<=M;i++)
) v- K9 Y( n1 _1 q- O1 V{  if(i==M)2 L6 L9 H. B$ P, C  w6 Y$ @
   link[i].nextp=1;
+ R) u0 b9 }& J4 r2 w   else
) X# d6 Z% y0 g" L) x   link[i].nextp=i+1;
7 k# u* C/ [/ ~4 z' a  link[i].number=i;
# H7 y6 P9 E0 o6 R6 N% f# ]}% q7 x% E% D! E: W$ i( o1 V  `& A: A
printf("\n");
6 E$ ?+ G! C1 h( K- |8 scount=0;( ~. v" Y$ h" k1 H( m
h=M;5 J  ^, }1 x, Z6 E  X1 K
printf("依次退出的猴子: \n");
8 l5 h% a' w# |& ]& C& Ywhile(count<M-1)
: t' S7 k! z, m( [! A) M0 N4 k{i=0;
+ n8 L0 z, G. A6 L/ Dwhile(i!=3), m: C& a# U& G' J: R0 R( |
{ h=link[h].nextp;
& T' W- ^  ~5 U4 Y- P; t   if(link[h].number)
1 C0 {" S$ y& ^2 S) n3 X; w4 Y     i++;}
. ]9 C. [+ U) D' F/ |' j) g0 J* [5 h: D7 G' D
printf("%4d",link[h].number);
0 ~6 B' i$ v- T" q6 \4 mlink[h].number=0;! W0 j* F  v1 L4 r7 k0 J6 L
count++;1 V# o2 H& T( v5 w3 j$ \
}9 [! {7 C% O. S6 g6 C+ `6 g8 N  E
5 M% l4 N3 R4 z# L: T  S
printf("\n大王是:");' }- G( O* y% W+ [/ p/ [7 v
  for(i=1;i<=M;i++)  |; g4 l3 \: f4 V7 G8 ~# O
  if(link[i].number)/ V, e4 q/ K: \* }
    printf("%3d\n",link[i].number);
: W" ~5 h3 F( C* Q' n" u* L* h9 r9 R0 K' d; w: n" A  C- c4 m8 x7 }( |

) o5 V: D- x4 ^( v}
+ F$ n+ m; P% x4 K) [* Q
第三种是普通方法for循环

" y: U, Y) H7 g9 M4 s5 h" P$ |5 |#include<stdio.h>$ Y. v& `+ q1 E- w: j% p
void main()
/ L6 r. u( O" d. g1 K. L1 J{ int i,k,m,n,num[50],q,*p;3 j2 h2 [( G' H
    clrscr();
( e4 o1 M& n3 {0 E* t6 A$ c   printf("input number of person: n=");: |) \# I* o' |+ X6 \4 K/ O
    scanf("%d",&n);$ u7 \  |4 h6 _- Q
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只$ h" B/ O- M# {) I$ [4 Q
    scanf("%d",&q);
) Z, j: q4 N  l3 H# C   p=num;
+ t' H2 {4 V! F" d5 H0 ^& e  for(i=0;i<n;i++)
  R4 B5 O5 G4 `& T& j% T    *(p+i)=i+1;
' `8 s  V- P" J' {9 ^" }6 H2 Q& j   i=0;
+ }" R% J6 g& R; S) p   k=0;, Z5 O; S! V1 e: @
   m=0;- p8 Y8 U' L" s9 I
  while(m<n-1)6 \# x$ O6 D, B
   {if(*(p+i)!=0) k++;" |( @: q/ a7 |: i' R. M; S
     if(k==q)1 J7 @: E  D! u% m! X
      { *(p+i)=0;
) R' e+ K- z( T2 d. R3 M        k=0;3 @$ _# Y& n7 C  b2 s6 S
        m++;/ X" i* i; p9 M. S: J
      }
" J% m! p5 C( D/ Z1 O9 S& x- T    i++;
) i0 u/ X& f( E3 ~; w    if(i==n)i=0;
9 H0 e7 D( ]4 f% e4 [   }
2 u9 J/ s( Y0 ?& r% k! W  while(*p==0)p++;' f( s1 T% w9 O' ]2 H, Z
    printf("The last one is NO:%d\n",*p);0 M( y- a* [, N, g! S9 ]2 C
     getch();
% d, z7 @2 t" j% X# F" j5 O  G5 u( H! J6 i: z& l
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
' X4 `9 A: F# V; c6 q# m  Znamespace 又费马达又费电. L' \* [( H  Y
{; Y7 @+ u  J" z4 g, n! J, H
    class Program
/ ^, g; k1 T0 W5 P- E    {  v4 b- g, K0 N3 k& v) y
        static void Main(string[] args)+ M4 Z& k$ Y& A* s
        {
- Z% |) r9 d; N" b' x            int m, n;
3 \  J1 @8 E0 j6 y            Console.WriteLine("请输入数组长度");
( t2 r& k; Y4 W6 H            m = int.Parse(Console.ReadLine());//m为数组的大小
, G5 B& q$ k+ c. v            Console.WriteLine("请输入要截取数字的大小");6 W. H2 B  P& U
            n = int.Parse(Console.ReadLine());
$ `  D  r  K, W8 Y8 V! x$ Z            int [] numw=new int8 J! Z! R0 d5 U4 ]  d
0 X' H) h6 P' I% f# Q) ]( G
&shy;&shy;&shy;;
# G" R$ o, Q+ g* F0 L; x5 `: h            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
5 e. c. F0 `( L4 N1 n3 b2 y            {
+ C' L  F/ ^' ^! L0 _5 n, D                numw[j - 1] = j;4 b$ q( S9 {; x4 E3 |5 u0 s
            }. |$ J5 k& Z* u" w: T1 i
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!. s# j6 ^3 E4 W- B9 w
            while (d != m - 1)
' H: Y7 S( l* N/ X            {
! p9 Y! T' l+ b4 U4 q% W0 X                if (i == m && d != m - 1)
8 B. g/ k, I# F9 f                {0 u) x, {- O6 {; H4 x: P
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
' U( |  X7 F9 N. q/ l1 d# p: b                    continue;. J" \& Q& N, }; z* o. L4 l4 z
                }
' p& Q" l, Z2 k5 u                else
  Z0 C; w9 V7 S                {
" A6 @1 \$ p8 D9 p/ F! _/ P                    if (numw[i] != 0)
4 R8 _3 d0 }$ f, D/ C. ^                    {
9 `7 B# V) `. |" e, Q6 L' D; U& d( E                        i++;0 L9 N* N9 A9 [& ~$ a. c! q4 B) o9 S
                        k++;/ A! E, P8 b! E. r7 M, W
                        if (k == n)
  n6 T% d% }9 ^                        {$ ~; C# a; Z# G! o
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了7 s2 x6 Y) V. ]$ g, z8 r
                            k = 0;
  N/ D; `0 r; G* a, \3 r0 {              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1$ ]; v& t) X1 y$ B
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
+ N; F4 G1 S+ Q) b                        }
1 X: g2 D7 l6 a1 V$ |3 S                        else//输出暂时还没有改变数组元素的值
( v/ \+ z1 \4 J2 `                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
/ {  s2 t: m3 ^3 b/ O/ o                    }4 [" n  Q- q& u. N; c, ?
                    else
% A6 v1 b& W" E                        i++;//数组元素为0,直接跳过,不计数。。。
4 `3 y% Z6 Z1 G) k! O# \                }" G' x% V4 @  }1 }$ S
* q/ d1 u5 z/ x4 K5 j' \

1 L0 L* t4 \9 x: F+ |/ L1 P            }//结束while循环/ G4 A! g9 z) w8 W/ o. l
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦2 S+ w, w  k" ~2 }& P. M! f2 t
           
% q5 z% \' n" R$ r8 v: S                if (numw[i] != 0)8 ^4 ^* W! u9 B6 Z
                    Console.WriteLine(numw[i]);
0 ~$ S+ j( W. K* k7 B7 S           $ x8 p6 E" D2 i( A
            Console.ReadLine();; c' n3 H" V5 K% @" ~: f8 d
        }
8 q, v9 [1 w9 E1 n7 @    }
0 ~% o# O3 |+ Z2 q5 g5 C6 ~! p}
8 N; M# l( i0 B1 b, x' t$ w: M
小甲鱼最新课程 -> 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-1-9 03:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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