鱼C论坛

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

猴子问题

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

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

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

x
大家好!: a0 I- ]2 }" h
这几天我在忙着编一个问题,我用了一种方法编出来!
% ~# ]3 K4 w. z, S8 G8 }但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!- }# t" c  v, G8 Y
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 8 E4 |. ^' v+ u

) I2 V2 l0 O* `/ V  i  A
' ^- L( @, i6 n' v
                            题目9 K& ?, G" W4 i) L7 f, a  |7 O! Y8 g
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
8 ]0 `' O/ F) ^1 e" c* u5 J6 W9 _$ P第一种方法:利用循环链表# ^- ~4 }6 c  h5 u+ g$ M
#include<stdio.h>
9 {. Z! e8 a9 c3 n' w#include<malloc.h>
1 H* ^7 J* Y3 a7 g$ R- z#define M 8            //共有8只猴子
/ A1 r" S& [0 Q5 V6 a# Q) L#define N 3            //数到3只时退出第三只8 H+ q4 ?) H5 F* T* O" R
typedef struct monkey+ z: r0 D# L" m( B" _
{int number;1 V! u# U) S2 b$ z3 N" F- x5 o
int flag;8 ~8 t6 L+ }( ^! k
struct monkey* next;# b3 {% b9 n- j* a+ f# V
}MONKEY;
+ V: `8 H0 e2 V! B$ ~main()
8 E" ?7 y3 m: d$ B2 b{ MONKEY *head=NULL,*p,*s;5 V3 \. P/ M9 a4 N
  int i,sum=0,count=0;
, W0 [: V) k8 ^$ w, p# |  clrscr();              //清屏8 v  V2 s2 h, ?5 A& J; \# r6 m
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存: {9 s* Q  A# ^1 `
  p->number=1;p->flag=1;. y( J0 T' L1 f" s* Z9 P
  p->next=head;" j8 m  d& D: v6 o. h
  head=p;
5 r2 g# ^, W: G3 i2 O6 @  for(i=2;i<=M;i++)
) H1 C- m' t$ R# R! C" \    { s=(MONKEY *)malloc(sizeof(MONKEY));# u# k) R$ K  S* G& F" }; e
     s->number=i;s->flag=1;: B1 \$ J% F  X0 M6 J! `
     s->next=head;- A1 z/ {8 B: B) C& Y
     p->next=s;p=p->next;8 O. Z7 v& Z; D4 U) m0 [$ f& J& r# l
    }
) }. t3 ?. }! u4 @/ E2 E3 c    p=head;
4 [# T' G8 h' W7 L/ P* F. m   for(;;), w# N6 X* w3 e' ?' Y. j9 u
    {if(p->flag==1)
; ~2 ]: W" A1 d% o1 J8 Z$ F4 C       count++;7 p7 m$ E% r( i$ a$ S3 H. u1 b) K
     if(count==N)  J5 {6 @, S. l# _) f
        {p->flag=0;2 H. i, o- t2 {  I( ]0 t4 `
         count=0;
5 O! ?, O: z7 |3 X& S* v; f         sum++;}$ Y; w/ \' Q* l0 C
     if(sum==M-1)' [4 ]' s* [/ M3 a
        break;
8 r3 |  [* [  _' t5 `( F, C     p=p->next;3 s$ t+ I/ A, p# M. q
    }0 z6 |4 v# x* O4 k; W# r& Z
    p=7 ?  t1 }& O8 H! F
    head;
5 g' h  `: _1 i, v  C" G    for(i=1;i<=M;i++)
4 |' F( g9 z2 l1 O    { if(p->flag==1)
# k% J1 Z. ~# L" D1 R: n4 X0 H. n        printf("\t%d",p->number);
% u1 C! ]1 j7 Q! O      p=p->next;
: b) Q8 r3 P  y6 O, B, j    }( k3 L4 y& c$ z9 [! d. _$ X! B
7 D# }2 ^3 p8 S( m. s% M

" a2 Z7 p/ F' \! V' m7 [4 b& [) w! y) D6 H! B/ Q( i
}
" G' n, e2 {3 y6 _
第二种方法:数组" G  e' M, v, Q
#include<stdio.h>8 a  i7 v1 d$ B& F0 {8 U
#define M 8' X: m6 D0 \0 X4 F% a
struct monkey
9 s9 m5 q' z2 F! f1 n{int number;- C, i, i1 _4 S/ s. J- O
int nextp;$ v5 r* Q  d9 Q8 e6 u% x8 E
}link[M+1];
9 J" U5 m. `  X" s3 ^0 N6 V8 n# k+ h' s( S, f! h) g
void main()8 W+ N& G/ O8 }1 s
{int i,count,h;8 H$ B# Y$ C4 g) A9 U8 P
for(i=1;i<=M;i++)% [5 @5 z. F$ F; }) l* {
{  if(i==M)1 O. W6 A+ ?$ B/ K! O/ u" v
   link[i].nextp=1;
* u8 H1 E- a5 I   else
& _! O+ A  x( m4 r. t   link[i].nextp=i+1;
$ [! s* f& G! K, y1 I$ C8 K7 ^  link[i].number=i;
$ E: v( [6 i' `$ U0 {}5 ]. ^5 j- i! _+ J
printf("\n");
- P& X# Z7 ]3 U1 ~! Scount=0;7 T0 ]' r" M9 B+ |
h=M;
7 w- a+ t* Z( _& V; q, B3 ~4 Sprintf("依次退出的猴子: \n");
* m, e. W2 h  P! c/ Z/ |$ Zwhile(count<M-1)
' N$ f5 [" `, j( }{i=0;
1 D, R1 D" F0 }/ U$ I9 _- c' G- @( Twhile(i!=3)
9 v4 f/ @2 s# E{ h=link[h].nextp;
. H6 J6 U, O: b- w8 ^; \   if(link[h].number)
1 T  T! n6 C$ b" @: v- |     i++;}
" H  P) W3 ]# i  I+ P' b$ h4 O4 S5 F- A+ p2 n! o
printf("%4d",link[h].number);
  _( ?) Q) W7 Z( a! x( A; ?6 w* {link[h].number=0;
- K: \" Z" H  I: x* Vcount++;! W$ G% k7 X4 i" \1 I
}
3 q# D: t3 U% C; w1 f! t: s2 D9 ]: Y7 K& J! E" z4 E
printf("\n大王是:");
& [' A. d+ i/ I, a5 d8 t& F  for(i=1;i<=M;i++)% K( F5 I0 Z" O- }' \( S' J
  if(link[i].number)
; m$ L3 R3 V7 e; g8 l    printf("%3d\n",link[i].number);% O) W" V# [: b: w/ ]
. X5 Y  B7 x9 ~3 ~  t+ V6 W" F, X$ t, j

: K$ b0 n8 U1 H6 _7 {}
7 f+ E3 h) s' l6 u  h5 S
第三种是普通方法for循环
! P  C1 h2 w; V# o: X; e5 R" O7 _
#include<stdio.h># h  ?5 |% p5 @; [
void main()/ a0 t3 ^( l4 L6 s3 p. U4 p
{ int i,k,m,n,num[50],q,*p;
1 ?0 [' M* n# A+ w8 W5 }; m    clrscr();" {, P+ t, d+ T* I- \$ `/ P
   printf("input number of person: n=");4 K6 @. p! V% u
    scanf("%d",&n);
/ S: _; \7 `6 ]5 }printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只& y' D* P2 q7 G$ J. E: k
    scanf("%d",&q);
  ?9 c( Y2 p/ n" B   p=num;5 N) A( c- q+ S' \/ K  R
  for(i=0;i<n;i++)
. Y! z2 F' X5 L- l    *(p+i)=i+1;8 W- U% a! |9 p
   i=0;
9 ]/ A) b6 O/ r0 B   k=0;; U3 K7 O! K3 k# }( Q
   m=0;
+ g" D0 x8 x5 p1 ?# d  while(m<n-1)
0 [+ a7 E/ E" p0 t. p4 p   {if(*(p+i)!=0) k++;
1 E, k2 q% {' x$ m& Y6 w     if(k==q)
$ H8 w! ~! ]- o      { *(p+i)=0;
+ }" \$ e! C, ~) I7 m# H        k=0;
) h8 G3 Y9 y/ o( \1 G        m++;
7 m1 h% r8 u+ \& V& x& P. T      }! }3 m/ T* U5 o4 g( v4 v% I
    i++;
) x( }& t4 C! @3 _# o    if(i==n)i=0;1 v* f: a( `- G- Y+ l4 ^9 k
   }2 \. p. y  y* S- @, e/ y
  while(*p==0)p++;" b3 u  f& k, @; w- h
    printf("The last one is NO:%d\n",*p);  U# k- a& n: `9 M
     getch();
' M/ X3 z2 O" Q  ]! i' G1 {* F9 j0 W# W: @" E! u/ u
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;5 L- l1 _7 c/ \2 O) |" ]
namespace 又费马达又费电
  A& Y6 |& Y5 O' Q$ u6 p' S  R8 G{( w8 ?9 m' R3 D! v; y
    class Program5 c  X+ I* W+ |0 P1 N
    {
* [1 U, i* b! R" E: j0 z( s3 c  a        static void Main(string[] args)
, K# y6 u6 u4 v) p' V        {
9 g7 w9 h# I% C* M6 s5 B            int m, n;
9 U( x# m* a# s0 w            Console.WriteLine("请输入数组长度");: L: ?! X) D! q0 c  Z6 p5 }
            m = int.Parse(Console.ReadLine());//m为数组的大小
8 Y4 a- C! W* `5 k$ V% i4 {" B            Console.WriteLine("请输入要截取数字的大小");
: V8 C- M3 y; \9 F            n = int.Parse(Console.ReadLine());
4 r# q" \  G% }# w. z$ V            int [] numw=new int, M/ D. Y+ x5 k# @, l$ B
" E% N' P) b6 R3 G3 m7 l0 V  \5 ~
&shy;&shy;&shy;;
5 |* A, }3 v+ Y4 W1 B2 V            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数/ J& a/ U- a: K. k/ V4 [' o
            {
0 c+ J$ a! ]1 D                numw[j - 1] = j;
5 w  |: X$ j$ \0 [- r: I            }
  l% W: f( x" c& q3 L            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
3 V8 {% G( T3 O; I( U0 z            while (d != m - 1)
0 I& p3 b- Z7 t9 G            {- @/ d+ ~4 n2 k, c" S' n
                if (i == m && d != m - 1)
! h' j+ u0 o6 m2 y1 z                {
5 u" n( B  [& U$ t                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
/ I- z! |( ~4 j) W& R                    continue;
/ V, Y# O) a5 s                }8 N) w. D! s$ X
                else. Q- G* p& F, M$ R: d
                {
4 [! R/ u8 |6 \' q+ B                    if (numw[i] != 0)7 s/ I- }) t( V% T! m3 v: t/ c( L
                    {5 u8 E4 E" ]6 n. J" D1 ]
                        i++;+ i1 i. o/ P6 U8 Y9 j, t: P5 {
                        k++;
2 J# n8 `3 `$ H7 l3 V" j8 w' a, j                        if (k == n). x0 K* G1 r6 i& b7 q
                        {
) ^0 N# U9 j* o3 d4 W5 @                            numw[i - 1] = 0;//把在n位置数组元素的值改变了1 d" Q; k) D+ u- @& T: S- G) T
                            k = 0;
! t9 y5 N# V, _# r: r              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
7 p+ s- z2 i1 y, l0 k* z                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
! g7 d1 T. r4 T$ b' T% |+ b                        }6 |# I% e# R" J, g
                        else//输出暂时还没有改变数组元素的值9 X+ x1 f0 w: E; j0 k
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
( w/ q2 X/ G; ^, v: m0 I$ b                    }# k" @! j: y# i; K
                    else8 u* C4 w. @+ m6 Y$ X# ]6 t
                        i++;//数组元素为0,直接跳过,不计数。。。
, M" Q, ^2 W6 H0 t                }9 t' j' E9 H9 v- |- a

% J+ V0 g$ h& `" B& [# m+ s# j( J( E. g2 A0 z5 v
            }//结束while循环
- B8 ~1 m" q' [, M* E0 P' D1 E            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦% M9 V# J; G& q
           8 N) b# p% L1 j! r6 \" ?6 O) F# |
                if (numw[i] != 0)7 m6 V4 j# z  K2 e) R0 s
                    Console.WriteLine(numw[i]);+ G" z2 ^+ ?+ B8 }
           9 X* H2 M0 U) E
            Console.ReadLine();
3 C2 R& o+ z+ F' n* M1 B: c* V8 m        }
+ p3 e- g5 Z: g) B9 m! O    }
/ p9 a" {3 Z! j4 D7 n) h}
0 t" T: ~. E3 P* @0 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-3-5 11:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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