鱼C论坛

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

猴子问题

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

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

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

x
大家好!
) a/ _$ I6 u2 t这几天我在忙着编一个问题,我用了一种方法编出来!
. M+ g* S8 c  X( q0 v  I1 h/ T; w' V: \但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
- k1 i5 T/ Q! F( }注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 6 g: Z% _  f- a: t4 P- J

* o& Y* n3 d- y- X, R0 F$ u9 f6 X  Z+ G! a' B- x9 n0 L
                            题目
5 h& Y( T. v7 o: j- T  S山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。  o# }  V. ?2 Q; J9 t
第一种方法:利用循环链表
! O# h3 ~% a3 R# Q  P#include<stdio.h>$ V+ N$ j/ n  o3 t# n& F
#include<malloc.h>
; X7 t& v, A- ]% S! i9 u#define M 8            //共有8只猴子' V1 C( E, K( y2 Q  \* b8 P* ~
#define N 3            //数到3只时退出第三只1 Q0 e& D9 h0 {: T$ L( M" J1 v. a, g
typedef struct monkey
" W" N* ^: h) W1 P$ x* U{int number;' _' D0 Y4 A' y* x; x
int flag;
: H4 O) @9 _5 J) Ustruct monkey* next;
  R; O3 [3 o5 I/ r}MONKEY;+ x2 f; q  k5 A2 I& P
main()
0 \4 Q+ S% N- I; z* S{ MONKEY *head=NULL,*p,*s;
: n. M7 `* {6 X/ v+ f8 K2 N: _  int i,sum=0,count=0;
/ m' E; ]/ G/ j& V) J4 B  clrscr();              //清屏, C- D4 z& {/ `1 I, K
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存+ a- {7 j7 P, H! E
  p->number=1;p->flag=1;# R% n8 h( K1 [
  p->next=head;
$ H' e  C- j* ]% S) }# v. R6 _  head=p;
6 d) Y( \" Z2 N4 D0 U  for(i=2;i<=M;i++)& _) R8 H0 Y& ?0 d( H2 f( J
    { s=(MONKEY *)malloc(sizeof(MONKEY));
. R' \  p( Q  V' D6 N, X. X/ L     s->number=i;s->flag=1;  I1 R1 I1 x; z  M, B5 U
     s->next=head;
7 G* d6 m* w( s' j* h     p->next=s;p=p->next;; h6 q  j) p& I- V, o3 _  G
    }# H2 X% b- }! d5 v
    p=head;5 {" H: G4 t" H' f' g& n
   for(;;)  n/ ]: u$ a4 y" n& Z( _
    {if(p->flag==1)
. U6 [' @; D$ |/ i1 K! L+ c       count++;/ J, M0 [6 [) w/ V' J
     if(count==N)
% E/ }! L: d4 r8 c+ l/ b        {p->flag=0;
1 s4 i; \' i; i- U         count=0;2 L% [- v3 D/ H( k' X; s/ `2 T* i
         sum++;}
: S% |2 Q6 r( f     if(sum==M-1)/ y; F7 l- B' Z7 G2 Q, z0 R" |
        break;! u* I% b; F9 J8 l. H
     p=p->next;
4 ^2 J# J# s6 J0 z! k    }
! b; r% y) ?) t+ D' C) O2 h3 g    p=
. |$ H, O+ v, @8 R1 C8 W    head;+ K# B% f  P6 A# ?" b3 X4 b
    for(i=1;i<=M;i++)" b  ^1 v' M6 a
    { if(p->flag==1)
' F5 l- I/ m! S7 v  Z' N( `* x9 W        printf("\t%d",p->number);
" z. L- H/ ~# w" h7 R' e      p=p->next;
- z, V5 Y- y- Y    }: u* s# M9 H! x5 ~6 k! @
/ z( T' ]6 n! E/ c, j' e4 X

- B( ~' @( p! X9 }! {2 c1 D
' [% G8 ^% D' v) ]2 \4 @- B& D0 s}
# x3 k7 e! i6 p6 N! \
第二种方法:数组
) h, A( c7 [4 U#include<stdio.h>; y( S& X1 K0 ?; f
#define M 8
) k" U' @/ Q# U' q4 f: N4 l7 Fstruct monkey  ~( y8 M& n: @* ~1 `
{int number;/ X) K! h7 d! v; v& L4 c
int nextp;
- @- Z3 s  L% D; K- ?8 Q* O2 r}link[M+1];/ \. F$ y& O) r" l* V8 R( D
2 ^7 U9 u& P5 }! ], }
void main()
( Q9 h7 w8 N  c" Q1 c{int i,count,h;6 b4 ]' ~, A  ]# y/ u3 I7 E7 j/ W
for(i=1;i<=M;i++)
. X( d' q; S. W  _{  if(i==M)
, v9 L7 L. k: v3 D0 A- \0 @, ?1 T   link[i].nextp=1;! I! a( T; z  G& U3 f. g. O
   else
) C! |; K9 g4 p( J9 k   link[i].nextp=i+1;$ U, j& [* c  F
  link[i].number=i;. g( R7 z( D. Z$ i6 W: z2 V0 V
}* b* K8 n2 Y$ U9 Z7 c7 i2 o
printf("\n");/ [% ^5 b% j' L! X2 r7 W% @
count=0;" W6 @4 s1 o4 T' g7 J6 y, v. |
h=M;& x& ^$ j+ Q3 F5 s
printf("依次退出的猴子: \n");( B  \" X2 [0 N) H8 |
while(count<M-1)! q% ?# j1 h! ~; x4 @3 J9 i
{i=0;
- i0 o* K! n6 swhile(i!=3)
& g8 X- `9 F/ U  h" h{ h=link[h].nextp;
: k- G9 q1 E/ b0 s" d   if(link[h].number)5 C7 O; B" I4 ^; h1 }- C
     i++;}3 f* k1 E1 S; {6 p+ q

6 i; h+ k6 T" x5 ?- c; U' l4 ^printf("%4d",link[h].number);
* R& v; S* c" {link[h].number=0;
3 H. j0 l  G2 o- U) fcount++;
% ^! f/ S' L- |* v& M# q}
" b* r2 @" M. [, Z# x# k' j! S/ {0 x+ a; o
printf("\n大王是:");. I$ p; ?0 {+ V9 F" }# U/ D
  for(i=1;i<=M;i++)! S; M. N( N" ?4 T4 p0 [
  if(link[i].number); |/ w/ Z( ^$ z" G" h% k
    printf("%3d\n",link[i].number);* a9 J* {" I( Q7 |& ]

/ _" a1 ^8 l! {; L% J
) r' a3 k" I% V* c}
# [. F- h, |/ N: c
第三种是普通方法for循环

2 {: Y& Z( H( T. a/ W3 l#include<stdio.h>
" B2 _1 d  `; J4 Cvoid main()' G3 j0 O' C+ e% P5 Z1 @. B! J
{ int i,k,m,n,num[50],q,*p;- v" ]3 m( e: O# F& ^5 s$ L
    clrscr();' ?) s% O" C1 J+ `
   printf("input number of person: n=");
- a  k( g3 I% V) g    scanf("%d",&n);6 E% m  K+ C; k! L1 L( I9 u3 z0 g
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
& B% {4 F6 V8 E2 l' f    scanf("%d",&q);
, k% d% t9 C/ e   p=num;
7 Z3 Y' C7 A' V' M( X: a  for(i=0;i<n;i++)& I) ~# U0 U  ^& j  `8 i/ g
    *(p+i)=i+1;
5 M8 m- I( A: w4 b   i=0;
" k' _$ p* x5 S" M. ^" o   k=0;
: e7 c! M& J' p- c# v- y( T. F   m=0;
! ]* n. C, h  |+ }( Y8 Z& A  while(m<n-1)
0 ^2 Z6 _: d" q# t( i   {if(*(p+i)!=0) k++;! X1 w3 _3 t2 r5 z9 W4 f  n
     if(k==q)
8 r$ ]. ^6 f; K7 j9 {+ t+ l      { *(p+i)=0;
4 q7 [3 C+ q' M1 X        k=0;
+ U. d, A6 B9 s1 K4 c. J9 T" a        m++;6 v8 L) V2 F( d
      }7 n- V6 F" H: b. q9 ]' @
    i++;4 P( O% v8 y. A8 x' l2 l5 P
    if(i==n)i=0;
: h8 ^- m$ g. q4 @  C0 h* \6 w   }* U9 l( |2 i( }- l9 U: o* |
  while(*p==0)p++;. F* ^; D. R) S8 W
    printf("The last one is NO:%d\n",*p);/ i7 Y% U. R. q5 Z- J
     getch();8 K3 J; z$ d0 f: J* ^

* L# m6 A% I$ s1 C, `}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;; I. k4 m6 u; t- N3 x
namespace 又费马达又费电/ h' y$ x& E# k3 H
{& E' H! A! u  y
    class Program3 ~9 t& R+ \6 d7 K- G
    {- {$ o. q, a  Z6 k* E9 B! w
        static void Main(string[] args)
1 M  |/ r( F  ^' |# C/ G3 _- I        {. S+ G) t- a" S; U
            int m, n;% B) m7 _: a4 U- i; T# D* D
            Console.WriteLine("请输入数组长度");1 d. H9 p& z0 S
            m = int.Parse(Console.ReadLine());//m为数组的大小; b# `0 ]8 Z" U) Y, e  ?2 ]
            Console.WriteLine("请输入要截取数字的大小");
* e7 k. L, @* w1 S9 {            n = int.Parse(Console.ReadLine());
2 K1 ]$ t+ A% {% q/ a            int [] numw=new int
3 l3 ~" |) ~6 }5 N) c5 o
1 |" e# g' S' m  d1 o, o&shy;&shy;&shy;;' O  i/ O7 y) {/ i9 U6 Q
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
$ B( b. e1 A' |" I            {( _) c) c( l9 a, ]% N$ h
                numw[j - 1] = j;! W  E# E( q% n& I8 K" p
            }
. p7 w. K* ]. Z+ m! R            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
! t6 h- n8 y1 {* Q, i            while (d != m - 1)
  G& t0 i+ V; ^! e            {
- r2 M0 M6 i  D                if (i == m && d != m - 1)9 G, }& D6 F# q7 x
                {" `! G5 n7 p( |
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!  g" c4 O% N$ B# L
                    continue;
/ `. V5 h) E5 X. l' \                }
* T! \2 r; P; A! e                else
1 `0 q( Y$ y2 b* b, C                {
+ h8 m. I% i% Z: P0 o9 N! W( {                    if (numw[i] != 0)7 S$ ^6 F1 M+ r1 `: X; P5 l
                    {
% \6 o) S8 t% N7 y                        i++;5 I5 H$ H1 j; \, R
                        k++;
% l6 F$ v7 F9 t                        if (k == n)( J/ F' J: f6 L8 S
                        {
% M5 `( ^8 W& ~& R                            numw[i - 1] = 0;//把在n位置数组元素的值改变了$ ]% c# V' g% L2 e0 i% e
                            k = 0;
7 ^# H- D. Y4 a              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1) g' B+ Y: f; E7 y- V
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);6 _. u1 b) K/ U& B
                        }
0 {; F6 d  {( P& ]                        else//输出暂时还没有改变数组元素的值
& b: O( [$ d+ c! S. J                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);0 |! _" H0 u3 l5 e' J- C
                    }
3 U! |$ w8 ~# x$ q' m- D                    else+ u+ {# l3 u, n- g
                        i++;//数组元素为0,直接跳过,不计数。。。
" D' L! r# \6 r7 s' e9 ^                }
: [  [" D3 k' c  h/ S! p 5 F+ d0 R, Y& q8 Z1 @

2 W, ?4 i: L; c. A            }//结束while循环
0 U) h$ K0 R* o4 S! |) }, q! m            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦" ?  ~8 s9 q# L& H  O
           ( r% I2 q  J( C$ H
                if (numw[i] != 0)) i8 O- H. Q$ }+ y
                    Console.WriteLine(numw[i]);! d" ?4 }: D* G& d8 J
           
) N6 B1 n9 X# ^: l, d            Console.ReadLine();7 ^5 k! D" ^/ R7 n* C* n
        }( {- e. n1 M  ^% M2 x9 z6 m
    }
+ P% G/ A% q% U# b7 Q1 q}
1 t) x5 j8 F+ D, C, Q+ ?( }
小甲鱼最新课程 -> 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-7-24 23:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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