鱼C论坛

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

猴子问题

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

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

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

x
大家好!# X- L. t9 B9 V0 D  q
这几天我在忙着编一个问题,我用了一种方法编出来!$ e0 G/ |( Q% I9 Q7 s  D
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
$ }- b; J- q/ [1 B注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ) u! w- \& c% X, B" ]/ L3 ?
0 }1 R* ]9 {+ O1 W& I9 o' _
) k$ W* ^8 S* b( t
                            题目. y4 ~% E" P8 ^+ [7 e' {# [
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。$ b, E$ n. I. Z
第一种方法:利用循环链表- g# a! [+ W: _+ n& z% F
#include<stdio.h>  u7 r* W0 z' B$ ~" h
#include<malloc.h>/ Y+ w5 t+ H6 G% l  ]7 I4 R
#define M 8            //共有8只猴子7 \2 \( q' T# {3 B9 y1 [; l
#define N 3            //数到3只时退出第三只
$ ^" b) K/ r. Vtypedef struct monkey
, r' I5 r9 [: A2 q2 U8 X: z{int number;3 _7 T; u0 U0 M* h. Z8 _
int flag;
5 J5 I9 \% w% u5 n& cstruct monkey* next;: H5 e" a% S& M, o$ e# r) a
}MONKEY;* y8 e) y9 g3 b) s* A& W- R
main()
# S+ Z" A3 I! S5 A, C4 V{ MONKEY *head=NULL,*p,*s;# U% y. Z2 B) }* L* Z. ]
  int i,sum=0,count=0;$ z) E/ P" ^7 @5 q* B
  clrscr();              //清屏
- C9 [1 q0 ?. y9 p5 ^1 S1 M6 S  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存* b' O6 s" h! a7 o) l# K
  p->number=1;p->flag=1;: f% n$ R6 N* i7 Z& @2 w& S/ D
  p->next=head;* _4 X/ d' _- ^9 U
  head=p;7 r9 f4 w$ K4 }8 n
  for(i=2;i<=M;i++)
4 T/ P* D5 s( g& e+ S4 `    { s=(MONKEY *)malloc(sizeof(MONKEY));1 |. S2 w  @# C. ]/ a" j) H
     s->number=i;s->flag=1;; ^) Q8 ?. Q4 G$ ?- M: V5 K
     s->next=head;7 |' M2 c7 K: u
     p->next=s;p=p->next;
3 N) [5 D6 |$ A/ t- D8 C    }* L; f& z$ b. h5 C& w% W
    p=head;
4 y# o$ J* x* A3 z   for(;;)/ m& ~+ A4 H! r* r; |
    {if(p->flag==1)
" E, ~. [7 {. ^  c% @! P       count++;
: ?1 c, D3 _$ E: x. W     if(count==N)
: A; z1 z/ O% X$ F        {p->flag=0;
5 ?+ m% U( M5 v5 x9 l2 t& k1 J         count=0;
) A+ p+ x: ~! d. l: [0 H         sum++;}8 T( `( o2 b5 l8 ?! l! G
     if(sum==M-1)" e6 f% _' B* O0 x5 @" P
        break;
. I& S7 S) N) Z5 O     p=p->next;) \% ^0 o" M9 t( g4 V
    }
, A4 q# k3 x* q4 D/ @$ T% Z' O    p=4 R5 W7 A, A* x5 p5 n' P; A0 l
    head;
8 v6 g- _( O* F  V1 l, Q& f    for(i=1;i<=M;i++)2 S" U+ ?0 @$ m! L5 t8 p
    { if(p->flag==1)
& W6 b! r; t7 V5 P% \        printf("\t%d",p->number);
% a; u* G3 P1 l, t* P      p=p->next;
5 c( ^7 d7 i6 Z    }- l" C( X" t; U, r& u
% e. s5 J) Z" q" J9 E0 i) I4 ?+ u, p
* U6 d$ _" K% L, Q
2 ~2 T- M0 A$ x6 w4 G
}
4 u, F0 l8 U# i) }# Z
第二种方法:数组! I6 Q! @4 h" W& M# i" F4 U
#include<stdio.h>5 @2 l6 k# S$ g5 g- ?
#define M 8
( s8 c) A+ X' \7 hstruct monkey
& h, l2 z# g9 F{int number;
9 B  p- f" p8 C- b/ Oint nextp;
, W2 t' H! z) P6 I}link[M+1];; v$ ~  G; T& f: E! y
. d0 U) K$ F1 U% k6 X
void main()
9 f/ R, X! x: {/ h0 W{int i,count,h;
; Y+ b& e& R9 F  a5 d9 E: o- Vfor(i=1;i<=M;i++)3 t2 G! u9 `1 I4 E" D! w/ f# @% K9 x
{  if(i==M)
3 `/ S4 i7 o  @, U8 V8 N# q/ y   link[i].nextp=1;
! t' ~) O- B7 [   else$ q! t# e; p& B. O
   link[i].nextp=i+1;
3 G+ b" U. m! Z  link[i].number=i;
. j/ @6 U! ~  S, ~}# C" R7 N) v! T: y
printf("\n");
  {7 E, w3 O+ a6 w. \$ J6 }) Ncount=0;
1 v) E. a! }2 kh=M;
, F# @7 G, T! u3 J" Nprintf("依次退出的猴子: \n");4 F, N+ K. r! ^; K- p6 w5 L/ L
while(count<M-1)
  q, g/ {8 ]# A- T! R+ G1 ^  @; j* F{i=0;+ Q8 k8 k0 v8 n0 ]8 M1 G( Y: i
while(i!=3)
. f0 V( }3 ~- p( ]{ h=link[h].nextp;
2 }  @3 }! R- U' ^$ J   if(link[h].number)" Y% \" i) S0 t) B7 X
     i++;}
1 o+ X+ B* {) O# q+ U+ H0 W. h% s$ H6 J: P0 K2 s
printf("%4d",link[h].number);
7 Z& U0 \8 Q1 \5 f$ ]3 Elink[h].number=0;
2 }4 V0 l4 B- i1 ^! I2 y& M- Xcount++;: j+ @. h% ?! c0 S% I
}
6 E, ^: ]) T; Z& e+ u3 O2 t& n& M3 h4 C$ T, }$ N9 M# U7 S
printf("\n大王是:");% k# z9 t5 D+ \0 f9 \9 l
  for(i=1;i<=M;i++)1 w1 T7 q9 p& J$ U2 s* c
  if(link[i].number)
% u. P/ l+ f" @. v) g$ a* W    printf("%3d\n",link[i].number);) H0 X6 g: e& p5 ^! C

8 R+ P! `, q1 l" K; h
( F: ]9 g# x$ b6 w7 W: a}

% `- Q* a/ U$ ?3 b; a第三种是普通方法for循环

' G0 l/ y# T0 g% C0 W#include<stdio.h>
9 u3 }' M, T& n0 L% x. {void main()- E1 T( T$ [4 e  V
{ int i,k,m,n,num[50],q,*p;& S4 ]2 j9 W/ p2 U, Q/ f
    clrscr();
6 m0 b% y! O( M6 E8 L+ {& d1 d   printf("input number of person: n=");6 p; y5 Z4 ?( l; `" p3 p7 C. @
    scanf("%d",&n);
' Q/ D; I( I. Vprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只" I6 _9 [- @- X$ ?( f9 t! l% q
    scanf("%d",&q);/ c+ y- c% @" U0 d# K
   p=num;& O$ T0 C$ k9 d, ]; p6 N
  for(i=0;i<n;i++)
. K* `- f) X) }. k* z$ g- A/ H    *(p+i)=i+1;
. o6 d; r7 V9 ~, W& a# H6 w   i=0;& c% c$ e) M- `- t  I* `5 F
   k=0;
' O. o3 H( G  T# b1 f7 j   m=0;& W& h0 `( }5 c2 P
  while(m<n-1)
$ L2 t8 L6 N5 }+ b5 `   {if(*(p+i)!=0) k++;- q* Q7 {. i! x5 d8 n- x1 r
     if(k==q)
2 G  k; N% X6 K) }      { *(p+i)=0;
8 b& g9 h  l2 @8 q        k=0;  x1 v  J: R9 ?0 t
        m++;
, K0 O. q% A9 G1 r# m      }( v& F; X( [7 B! A/ ^/ t
    i++;
* `5 I. y1 \) ^8 y. T    if(i==n)i=0;
7 Q% n$ C4 c* i6 `# A; ?" m   }
1 U8 m/ c/ S* s4 d/ I. ?8 z8 y  while(*p==0)p++;
" J) L6 {: L  u- n; D9 ?: w* U    printf("The last one is NO:%d\n",*p);6 {; K- l/ V' L8 S
     getch();8 R! y, {/ J  N8 I3 e# o9 C4 Q

. v  z: z# g+ d4 W4 `' T}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
3 ~) j& X7 t7 M& r# F1 m# e7 pnamespace 又费马达又费电+ A! t" r  W( o
{. Y) K6 A  X# E5 ~' e- Z. e
    class Program+ D! T! {, i0 y
    {
$ _) a) P3 S7 h# N( t/ d        static void Main(string[] args)4 Z4 @2 |; W7 }+ y
        {
- K+ O( t3 a) S  s% Z; O  K3 h            int m, n;1 c- k% l. H' D- R! }! s4 I/ s
            Console.WriteLine("请输入数组长度");
2 H- L+ n" Y8 k            m = int.Parse(Console.ReadLine());//m为数组的大小
4 W2 [2 O) w9 e7 Z# d5 L            Console.WriteLine("请输入要截取数字的大小");% t: M" o% \4 F# Q5 q2 t8 p. w
            n = int.Parse(Console.ReadLine());
$ B- m' Y5 p. e* u/ p+ h8 c            int [] numw=new int$ N, K6 G2 X- n: X; ]

4 C0 c  [5 _% H9 x7 \  l&shy;&shy;&shy;;
8 ]6 P3 K( C: r' U. B4 T            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
" F$ B) r% k; R  B+ O" e            {7 C+ Z2 y( a" G& L
                numw[j - 1] = j;
2 J. d+ [4 ]8 o3 w/ s7 p% F1 L            }
9 v5 n* J1 f4 ^& C            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
. n9 V1 {, ^, U7 r  z8 w            while (d != m - 1)
+ ~# P* ]7 M7 ?/ M- V* Z- L( _7 ^$ L) q            {/ A9 [( ^4 b( b
                if (i == m && d != m - 1)8 R( a8 E; m+ \& r) S
                {1 C- s/ ]+ V, u7 c/ |3 H" o3 E+ x
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
! O* j$ V- L( x- e7 s                    continue;
& V% R, ?5 l" m                }1 N! Y. n+ }- t& D
                else4 ^. i) K9 Y# E2 J! y8 {8 R) Q3 W# M2 r
                {
* d6 h* ?& N1 F& `( b                    if (numw[i] != 0)
2 l5 \, V  o' s! }6 W9 l% r                    {
% U+ y4 d& i( E& G- v                        i++;
, a3 c/ L% N: [                        k++;
7 ?  O5 [# l- K0 C                        if (k == n)' T8 R2 ?& z# ?" Y
                        {' E- O0 k* O: o) `/ ~
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了1 O2 q3 q8 H4 [  X# d7 r9 j
                            k = 0;) l* C; P8 s  E9 O( q
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
0 {8 t7 y/ h6 t8 j, ]                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
; ?! `- S* w  {% \: a+ Y                        }1 p9 }& F" S' T  ]! E- c
                        else//输出暂时还没有改变数组元素的值
" L6 ^1 W5 T  ^# ]4 u9 _. T, d                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
  L5 ~2 Y8 P/ ~( w7 q# N. C                    }' u  L, z3 N4 D9 q# e& N6 W. T6 G
                    else4 q$ }+ ]" l6 l2 O# y: v1 k8 o2 b
                        i++;//数组元素为0,直接跳过,不计数。。。" A/ O3 c% M: H1 `
                }
0 s; s7 t3 j2 f7 S% J) i ! V, a: `1 B0 \* N

- ?) c% v% n/ g6 w8 @6 d3 O( V) u            }//结束while循环* g8 [9 e5 y* S
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦, }7 _5 W' T& C7 h8 C
           ) l0 p# P. ?$ I9 \5 i+ C* L& a- E
                if (numw[i] != 0)
' W: i4 p1 j9 u- p( J! ^) ]9 W                    Console.WriteLine(numw[i]);, b6 `; G0 \0 W, u
           - p% X% t, r; D1 n9 K! w0 J+ _  z
            Console.ReadLine();
$ O3 C; C8 y2 ~  I; Q        }  P* Q  K) _. Z& d+ N/ L4 J8 J
    }
" X3 Y0 q0 a$ Y}
# h- n9 K6 f" E% Z0 I
小甲鱼最新课程 -> 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, 2025-12-26 09:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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