鱼C论坛

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

猴子问题

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

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

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

x
大家好!
; b# M& x6 s0 d) J这几天我在忙着编一个问题,我用了一种方法编出来!4 v" K. R' b8 `) B6 @- _$ C
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!1 P3 h' i0 i* n3 o) _$ x
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 7 h: v, w% @% {3 W9 w( H/ \
9 ?; g* u& Y- e5 J9 w. N
- i" q" |9 a! e8 s1 |5 ~
                            题目" ]% ~; t+ J: r3 w1 ^
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。6 U# B+ I7 \/ J) g: V1 s2 r
第一种方法:利用循环链表
, G+ y; P% k% X) I* h7 P, }#include<stdio.h>
% {6 r0 x& B! U" Z3 V  C4 l0 R1 n- i: O#include<malloc.h>
" f3 N; x3 |  R4 t) N#define M 8            //共有8只猴子6 G: i/ J* o  ]
#define N 3            //数到3只时退出第三只8 Z1 J2 U$ P$ }2 j
typedef struct monkey- `! v* Y. e9 h  z& D
{int number;
' b0 Z+ W1 y3 u, ?int flag;7 |8 e# I( ?6 ~6 }4 c3 ~5 y6 U* g
struct monkey* next;
* N* ~; B! y2 ^8 v- S+ Q}MONKEY;
  g  t/ G( ~0 I2 X" _- Fmain()& u$ n3 @: G# x! d
{ MONKEY *head=NULL,*p,*s;  L5 L6 A8 m. a, w# A
  int i,sum=0,count=0;4 Q) G& U, v; W' N/ p& r' s
  clrscr();              //清屏# m; M9 z* R/ I# o( j% x# ?8 G4 w& P
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
" P9 K0 ^. u( w$ X/ f& Z  E6 W  p->number=1;p->flag=1;- h$ C1 ^! _8 U" y/ B
  p->next=head;
8 H( s% @$ X0 ~1 X; k  head=p;0 A$ G$ N, p* C* @
  for(i=2;i<=M;i++)
; t! b- f6 l% p) [3 `0 a    { s=(MONKEY *)malloc(sizeof(MONKEY));! R. b7 C+ ~  d. {3 t% h
     s->number=i;s->flag=1;
) }5 q4 A" \3 X. l/ y5 E- R     s->next=head;6 w2 x- X3 y. Z3 I. T
     p->next=s;p=p->next;; S/ p) m1 p+ k2 s5 Y+ X3 x
    }2 w3 _1 a# r0 ^! ]! t; E
    p=head;
! U2 l8 i- l8 A, l1 f- ]$ t   for(;;)
' h' l: J$ Z' ]2 s0 z# r    {if(p->flag==1)
' i% [! t) D8 G# T" S8 n" F% ~       count++;" T6 M' M# w) N1 r2 \+ _
     if(count==N)- |5 S7 q1 k& `' \' l* X6 G- L& o; Z9 A
        {p->flag=0;
) d+ U) h5 L+ J! L! }         count=0;( y  \$ ~% r+ f5 N' o  x1 V
         sum++;}
5 o0 g# V' g6 K9 L     if(sum==M-1)
4 ?# S* h0 A# P( {        break;
$ C$ h$ l; k! w7 [$ O& t/ H     p=p->next;% g) T% d# x1 Q7 }9 t- Y
    }
8 W+ A( |# r; A& f% h    p=5 p% L4 X, }* T* `( R+ H
    head;* M6 I4 d1 j  c. ^8 w) \. a
    for(i=1;i<=M;i++)
" w8 ~1 u+ V# i5 K" ]2 j1 b    { if(p->flag==1)
  ^3 g. C" q8 n9 H  Q5 c        printf("\t%d",p->number);
& f/ ^& s4 D# f0 G0 r& F      p=p->next;: e3 M- n, z5 d
    }! G* L7 P6 d( a2 y% d

& g. @& Z# Q2 U
) E* z* P8 ], o9 G, `% @
7 s" l+ A) E; u- T3 y* S}

7 v" e6 e2 i: b* Q6 p( }第二种方法:数组5 K) f9 U) K* s# L; _9 _/ M' c- `8 [
#include<stdio.h>
/ t8 T; \: j5 P/ C' C' J. M; H( I- y#define M 82 ^  O2 V6 u: q2 _3 a
struct monkey
' W8 f3 G/ V  P* \+ T{int number;
( ^5 {. w- e; J. S7 P. fint nextp;( c( B6 e' o+ j3 ^$ O3 a2 L
}link[M+1];
. Z7 d. c4 V% R- K( j
8 j% d8 u0 I  o+ \void main()  J, e7 r& H8 B: R2 M
{int i,count,h;; v1 u( M+ m' E% V/ _" N
for(i=1;i<=M;i++)
" ^5 d3 V6 W4 {" y{  if(i==M)
7 H7 P$ T" ?$ u& k- L$ M& H   link[i].nextp=1;
) F1 m6 a4 S+ t7 r* B   else: V5 G8 A: b/ O. @* Z4 h
   link[i].nextp=i+1;: O+ I: i4 \, ~
  link[i].number=i;
2 j  D& [$ \- }! U* ?}
9 X' v0 i9 z4 q4 K$ k3 `2 Wprintf("\n");/ Z) @) b7 v- n
count=0;) d' E- T1 i- ?
h=M;  G! P# ^  L4 a) N- i+ ~
printf("依次退出的猴子: \n");9 L' a; \+ q) s/ K. _' p
while(count<M-1)
, h  V& U: o; I{i=0;
3 C" l5 t7 \4 uwhile(i!=3)4 W; @2 w2 k$ e) C! b
{ h=link[h].nextp;' f5 Q; e  L$ T- G# ?6 Z6 w
   if(link[h].number)6 O/ z# V& P7 A1 X; F* K: m
     i++;}4 `: @' W3 W' B8 r' s* d" a# S" h. Z

5 l" T0 M, Z8 @( a: e) ^- Qprintf("%4d",link[h].number);% \) B  s$ k3 }, z
link[h].number=0;+ Y( k1 `" H3 l/ G% K/ ^" S
count++;. _( }4 ^, U) v4 Z4 [: N/ `+ }
}
8 v% q/ |& V# V. o/ f
/ O3 a) b6 X# Q. M7 ~printf("\n大王是:");' y+ y' g+ _# v0 {  O+ z% B% D3 Q/ X& e
  for(i=1;i<=M;i++)* K7 A, N) x; {( h$ H
  if(link[i].number)
$ w6 e& h. A" h$ d    printf("%3d\n",link[i].number);. j: L  [) \7 E( j8 A% d( h
0 i) b6 |! V. U. H7 A8 n
2 K/ n9 R, G, F- |4 h, L* ^
}
6 [  a% W2 }8 n9 s; `0 ]8 m2 H5 E
第三种是普通方法for循环
# Q* u! v6 l: x3 e, m% _- v7 ^
#include<stdio.h>9 M4 [# X# O. V' f5 X$ j
void main()% J+ ?( Y& x/ S
{ int i,k,m,n,num[50],q,*p;
2 g6 `" v) b: ]/ V4 Q; C    clrscr();2 O- n. I3 o# N
   printf("input number of person: n=");
3 _  N! W% `1 j4 t+ j    scanf("%d",&n);
% p; ?% x4 m8 w. U4 M" r0 C" F2 eprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只% n+ ~, z; K4 x  f
    scanf("%d",&q);; d2 a+ {" c( {; H! U) n* U7 Z
   p=num;! R* G" _1 O' l' T' }# P  o
  for(i=0;i<n;i++)
! p1 O( z2 Y) O$ p2 {' l    *(p+i)=i+1;- n# t; @; }. r& I8 W3 `$ h
   i=0;
, H) Q3 y2 z# e4 M2 t   k=0;
+ H1 v# E; f7 m) E   m=0;. ?5 O' H$ v4 s$ B
  while(m<n-1)
; t+ ]' A8 A* M   {if(*(p+i)!=0) k++;' h1 {0 |$ v5 [; }  V) n
     if(k==q); ~- l4 |% B) x( p5 k9 Q0 `+ r
      { *(p+i)=0;
* d7 q' x  i+ F8 _        k=0;$ v& O( D& b! t0 q# J
        m++;/ z3 G9 C6 ]& Y. u1 k
      }
) N2 a7 |" ?  [    i++;1 z8 {9 O; ^' o& U
    if(i==n)i=0;" z$ `, I1 U. ]% V( F0 M* b; _
   }2 l! |  S0 ?0 q  ~3 N% w; e6 f
  while(*p==0)p++;1 `6 z" W  N. a5 V; h) J
    printf("The last one is NO:%d\n",*p);4 E( l# f. \4 B8 Q6 T+ a
     getch();
8 {' \4 r/ x3 E% X  K; I0 |7 b& U' W
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
% p  c& V& l1 k/ I& Gnamespace 又费马达又费电6 S2 }& z& t0 Z1 f
{- j: r; w  |1 h. N7 j+ v
    class Program1 d; U0 w3 [! h: X
    {
3 e2 u& P% M# |0 [$ U4 X        static void Main(string[] args)
, ]7 O% L2 h3 W        {% R; |3 i1 _2 |" J% [
            int m, n;
, |9 L" {8 G# m3 z/ x/ R            Console.WriteLine("请输入数组长度");
3 {- |6 S$ l3 X( L! w! {4 b9 I7 O            m = int.Parse(Console.ReadLine());//m为数组的大小
. p5 }, b( I; [1 n: h" p- o3 w- [            Console.WriteLine("请输入要截取数字的大小");
4 I8 \0 J- G3 p; I. }' f            n = int.Parse(Console.ReadLine());9 _9 c: F( g" [1 y4 g' |( g( ^4 t
            int [] numw=new int5 Z- s3 ^# h( n( [
3 h1 L/ A/ l% r+ O# _# L9 b
&shy;&shy;&shy;;: D; d# u7 l3 h1 z
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
6 n  ]! a! ]' D8 L  K            {% f. k: G9 ^' S' j$ M% A9 `5 ?( }
                numw[j - 1] = j;
6 M$ g2 w2 ?2 L4 }7 h            }
0 H6 s. z6 q% ~5 W            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!, f! {8 l2 Y& P1 D1 n) Q: }
            while (d != m - 1)" m% Q+ M& p( @, ?
            {
- _2 _' V" [! ^7 k$ @' _                if (i == m && d != m - 1)3 J, j1 J2 b; x# j
                {: b4 R( S. d: A- t" y
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!6 y' s: h* n2 U2 v$ o
                    continue;
- \9 s/ ?  w+ I' t                }7 c2 M) K- b% E/ P, W( a* l1 v
                else
* w, e% q1 \2 n                {
/ j  V5 }% k" C* B  F- z+ l                    if (numw[i] != 0). J9 o' \% y% r% x! A4 |
                    {
% n3 E; r( g) ], N                        i++;
' r4 }. }6 Y+ _3 |* q                        k++;
4 o) p+ Y4 w9 o, p+ ~: i                        if (k == n); y# H, G5 a, g- n8 p2 O
                        {) _, @) [# V7 D2 d) {& V9 {" I
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了1 m6 G- v9 Q5 f7 k: a8 a
                            k = 0;8 J1 z. g4 h2 _# J- B
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
% g, y( W7 H' P3 f                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
- D% O" U" s2 _2 A! L/ G                        }
/ k# z+ |" L5 |  L$ G7 {0 v, V                        else//输出暂时还没有改变数组元素的值( F/ m. J. W  W
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);  E& _9 P  [# t
                    }
, J+ ]* D  y- \' F6 n; u& I                    else
* l+ D- r" [4 X8 T/ I! ~: b/ W; K                        i++;//数组元素为0,直接跳过,不计数。。。
/ W- F) g0 h/ ?3 T6 Q. T/ w                }$ |) W3 `- m4 J# h( Q
! d- e" v: O- O' {  I
! E' a0 l2 N8 E$ C2 n7 Y8 b# q
            }//结束while循环
, t7 b5 w  T6 L) u+ q            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
6 G7 j6 b  p3 z1 p8 f: P8 c           
4 |. r" N+ P" e! [( Q, o                if (numw[i] != 0)  Y. Y; I8 D  M( z1 a2 d. F
                    Console.WriteLine(numw[i]);5 _& `1 P5 _$ @( ~$ R2 k
           ) G* i' M1 A- v
            Console.ReadLine();: z! O* n$ [: B, a( ^# G
        }; f* s# v) b+ z
    }7 _+ L# ^7 v$ [* u7 l
}9 i2 f1 }. d" g
小甲鱼最新课程 -> 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-15 00:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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