鱼C论坛

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

猴子问题

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

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

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

x
大家好!" T5 K4 s0 U3 s/ p* }0 [
这几天我在忙着编一个问题,我用了一种方法编出来!
/ v" d; w( b7 i5 X但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!/ }5 ?: K- }8 S! {$ Y
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 - Z& N, w( v' f( ~+ c. J" B, {

* ~9 [) F- y3 T9 r/ P9 h1 r7 _1 L- F! @% |* J) h! v
                            题目* T+ a% m; x; Z( M6 b% K: I% |' J
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
# ~1 h, |7 r- J: N第一种方法:利用循环链表& i2 e8 b4 _" J9 ~
#include<stdio.h>6 S" P/ G4 N2 L7 p0 s7 l; F
#include<malloc.h>- r- l8 v: A2 Z" f
#define M 8            //共有8只猴子
4 R! J9 `! |2 \% h+ `#define N 3            //数到3只时退出第三只
4 J! L6 n, O3 j$ @/ Ztypedef struct monkey+ \: j+ _, w8 a4 M. q
{int number;
& W2 d6 t' X  ~- Q# cint flag;
, K* ~0 T9 z% G# a. `; @4 gstruct monkey* next;8 z3 |0 l* y" _8 d# I
}MONKEY;
1 {9 p! ]7 `, m+ s$ e1 Y/ Hmain()' u. K, u& Y6 ]8 ~- g2 j9 [* y
{ MONKEY *head=NULL,*p,*s;. a# D* K1 j: f: O- m# l
  int i,sum=0,count=0;
5 y- \+ {% e2 b5 R2 I+ I5 g  clrscr();              //清屏
$ i1 [: C9 E" M0 l. _  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
% q3 E( |3 [: G  p->number=1;p->flag=1;: ]/ k# N& t: A5 X. l# R1 Y
  p->next=head;
$ U; s: g8 N0 d9 x9 G  head=p;! _8 t7 }  x8 D! ?/ F
  for(i=2;i<=M;i++)0 D, f; i5 F$ M
    { s=(MONKEY *)malloc(sizeof(MONKEY));" Q, i1 j0 G9 a
     s->number=i;s->flag=1;. [6 W) @' j6 m  N
     s->next=head;
6 i$ G! X: \" X% u     p->next=s;p=p->next;
: g1 M. G, [6 `; C7 w    }
; w% e3 i: [7 o( m3 h9 S  I    p=head;
1 @1 h0 K7 E( N7 C* _# H   for(;;)2 W* l" u9 N) M/ d2 U
    {if(p->flag==1)/ h  v- N5 A& v
       count++;& e/ Q0 _( u, u" h" L6 @$ n) h
     if(count==N)7 x( y. g, R5 A. ]$ @
        {p->flag=0;' y+ G/ r* G) x9 h
         count=0;: P* T" z$ h$ g
         sum++;}! {* Y* w) t1 Z
     if(sum==M-1)3 u3 n; Y% F/ Z; m; z3 A
        break;; W" _, v( w0 t$ E
     p=p->next;
8 A; C$ w* ~% V" }* p6 P: C6 p    }" r& f+ J, g4 w
    p=
& ^3 n8 \! f( P0 n    head;( [4 Q% h' Y$ X* n+ I( z
    for(i=1;i<=M;i++); r5 V4 d2 T% E% h1 C$ _
    { if(p->flag==1)/ v, J% I5 x) ], M% `
        printf("\t%d",p->number);
5 a& ~& w" @# D, U      p=p->next;
! \) t: s3 O0 a' V! o  ?/ i    }
8 {! z& A+ i! i/ ]) c
, b8 Y5 o( ^/ z- m& E, ]' t! Y$ K0 ^0 ]+ F4 H2 P
+ g: b9 ]: e* e( `/ T
}
- ^& r' o! E: |
第二种方法:数组
, B7 P3 Y5 j3 a#include<stdio.h>- |5 x, c" N' N- K  m7 T6 S8 N0 P9 Y
#define M 88 s3 X4 c8 M: x$ `
struct monkey& F# Q, M! |7 [6 i, m! u
{int number;
5 n, D! Z: ]  _+ U& rint nextp;
- I. L' A3 h/ ~( v}link[M+1];% O! A- H" y1 ]9 M; x7 H" A( v
5 q$ A( |4 ]( B4 R9 N$ x$ G- {0 n: l
void main()
; e- `' Z0 h& J( k{int i,count,h;
2 ~' P! }2 N0 q, G; M7 H4 nfor(i=1;i<=M;i++)
( ~" C4 e1 K+ H( J' b( ^6 v$ g{  if(i==M)
4 N4 j# J. [$ G/ X   link[i].nextp=1;# @  d) ~+ w( t# J0 m: L4 l
   else
9 y3 S2 A8 Z! w1 Y( L8 J- s# b3 X   link[i].nextp=i+1;/ T9 K/ r2 L* P# _1 \, t
  link[i].number=i;
# K8 b  X( Q) t8 q) s. f}
. j9 p, P0 p6 X' p! T# L1 jprintf("\n");
9 Q  Q& v+ U% K1 u% Y' i! N1 ecount=0;7 z! d, f: E2 r  Z7 d
h=M;+ C/ \1 b$ y4 Q5 |
printf("依次退出的猴子: \n");
: y3 \/ K; @" e' {' G( K( J+ ?while(count<M-1); r- s0 \3 C7 ^$ ^# i% y
{i=0;
; u. u& e, _7 c4 _8 n( _+ K2 w7 ~while(i!=3)
& u& C: y4 _. M, V{ h=link[h].nextp;" B9 M, D+ a  u  n  L
   if(link[h].number)
# [" _5 a6 g2 g+ U     i++;}& K2 M7 b* o3 ^& W# X
( r- y: D" k( |. t3 V6 n
printf("%4d",link[h].number);" T, _0 b% @2 O/ [1 ^
link[h].number=0;
  v: a: P! c0 h8 q: e" Kcount++;
8 e" n& L: i& h9 U: l}- r& k  `8 N9 [* @/ R& O: L; j

( s$ x9 S1 f( F8 O* M# S2 F3 V1 @printf("\n大王是:");( m% V" A4 g$ p$ n6 E" j5 d
  for(i=1;i<=M;i++). e" ^4 c0 T' `' O
  if(link[i].number)' d7 x' [( \$ G9 s) {
    printf("%3d\n",link[i].number);: q" n- H/ }" y, v8 j

0 [9 i5 c& \2 \& f" N+ L7 e% v) e& r- q, ]0 L5 Z2 w; R: z
}

" @4 b; x) C1 U# V/ w& o第三种是普通方法for循环

; C1 }; b( e, ?, d3 _* C#include<stdio.h>
8 [* o" O  a9 |$ Lvoid main()
3 d3 d, H" W! S4 q$ w0 t{ int i,k,m,n,num[50],q,*p;! k" a0 e2 |+ W& n( R- ]7 U8 Q
    clrscr();* c6 F% D8 f, ]/ d4 {
   printf("input number of person: n=");1 k/ P  J' g# R$ u
    scanf("%d",&n);1 v: B# n! U7 J" x
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
2 ^1 M, L6 E# H7 i' U, H; b' K! Z! ?    scanf("%d",&q);
; |0 T. A1 ]+ |   p=num;# l% \. E, \, b: }
  for(i=0;i<n;i++)) ]  c# `& q$ i, v# o) S. o
    *(p+i)=i+1;
% x1 w4 Z6 E7 `5 v4 R, i   i=0;- O$ G0 D1 l; H8 q, B
   k=0;$ }8 |: r* L0 l0 l' _
   m=0;
; I0 @5 H4 Y2 U$ y; ?  while(m<n-1)
+ o. G0 `: V8 |/ j% }3 \5 m1 D8 m   {if(*(p+i)!=0) k++;
# |/ i/ u4 G3 I* ~3 p3 R  H7 x/ R$ B     if(k==q)
' u0 n- v7 `  S) o5 @5 G& y      { *(p+i)=0;' Y& i' X8 K3 V' F( h
        k=0;" B, q( t6 Z  j# R0 i* m( [* Z7 X; S
        m++;
# V7 {3 X( }: g  R: z      }
3 I6 \! S0 H* P# I    i++;
% w! K0 x" O) J( t! H$ D: O    if(i==n)i=0;
! N6 I) j+ E; i; p4 w; r   }
& H1 |4 B5 ?2 Z* a/ V; P2 g  while(*p==0)p++;5 E. v  P) V1 \' Y( k
    printf("The last one is NO:%d\n",*p);
4 T: M( n8 u1 I) F) I     getch();
7 d# k  N; ]8 [9 ^6 v  n2 {, r& y0 k6 m. a5 \3 C# l$ z0 g' N! g4 H
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
0 J2 Z4 }0 G# [; \! O1 L, ^$ L$ q3 Cnamespace 又费马达又费电' Q0 l6 @) ?. J+ C& C2 w, L, {
{0 c" D8 J+ Q+ I+ x4 `$ y0 A
    class Program
- |* h& n; d2 U1 |! K" r    {' J* J7 V9 V1 k; q
        static void Main(string[] args)
& x- I$ }6 U3 d6 n        {& q. c. |. x3 a# g: w7 ^9 }9 o
            int m, n;0 w! O4 I! x5 r9 d! `
            Console.WriteLine("请输入数组长度");3 E# T8 ~$ m. _5 t: i7 |
            m = int.Parse(Console.ReadLine());//m为数组的大小# q. O. g0 z/ @: B/ A) O( ?
            Console.WriteLine("请输入要截取数字的大小");
' f. ]9 [. P4 V" T1 p- M1 t! z            n = int.Parse(Console.ReadLine());! J8 E- _, W1 g7 x
            int [] numw=new int9 n% j5 f- v7 g( \, g* w: |0 o
' F* B( M# F9 D$ A" E, N' I2 h
&shy;&shy;&shy;;. s+ X! d1 P3 F, o3 i! }
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数& q) t5 ~0 E: \
            {/ V7 P" k0 g' t( h/ N
                numw[j - 1] = j;+ g* z" Z/ w9 [" Q' x- F
            }
8 }$ \: B7 f/ o: N/ G# Q3 s7 b8 E            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!6 C' o: |3 G6 ~8 @
            while (d != m - 1)+ w1 C6 |8 A2 Z0 s( N% Q2 b. ~' v2 A
            {7 ^# e( K- j+ J
                if (i == m && d != m - 1)3 k; M8 A' n2 r1 \* [4 o
                {1 F, n/ S$ W5 l% c$ z" P% S
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
% e+ k' n3 U1 g- V3 R& L- w                    continue;- _" {1 U( _" A! E
                }5 t7 g2 @- u: D; x/ R3 l, Y+ p
                else/ p4 o# h3 X! G0 p
                {3 Y) i/ ]( }* p- ^
                    if (numw[i] != 0)
! L2 o! @6 f# f, Q0 N( x' ]                    {0 n* v3 u9 [* j2 G% D; w
                        i++;' c6 _2 |$ ~* o/ d7 I! \7 d9 x
                        k++;$ {  i8 w3 f  b' Z. R4 s
                        if (k == n)% A! T5 |6 y* g+ l1 K2 M4 `
                        {
3 r7 k) g, r, u% _. I; w1 ?  o. f& v2 d                            numw[i - 1] = 0;//把在n位置数组元素的值改变了7 ?6 q, W( T/ }8 O/ e5 R# R* ~
                            k = 0;3 d' p% s3 @+ X: c2 A/ x! F
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
( Y8 H" n6 V5 F7 n, P% T                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
# L* J1 W1 a+ k6 g                        }
2 Y' L( W8 s( q$ Z3 x5 G* D                        else//输出暂时还没有改变数组元素的值
$ B) `7 ~9 J/ g, a                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);  m4 ^, J& K+ P$ W
                    }
9 B7 H" U: y  b- a1 `* B) S6 Z; [                    else1 H; ]' `2 U8 w& Q
                        i++;//数组元素为0,直接跳过,不计数。。。
& `, D. M7 ?/ e% ]$ h7 Q                }. }0 F; K  J. c: }0 s% f, ]' @# E
9 c! m& \' Y: M8 y& v: I2 r
  o0 a* s! a- _! Q8 S& V1 C
            }//结束while循环( [: G" O% `0 m9 g
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
: U0 h  p0 `2 m           $ P2 H' C* z  [# I9 ~, R
                if (numw[i] != 0)
0 Z) E$ v: n( k- E, C& p5 N                    Console.WriteLine(numw[i]);* }9 }" S* _; ?  G/ P; E( G- E0 I
             ]' h6 z# e' ^" ^  m; z* u( ]
            Console.ReadLine();6 o7 V! g- ?% J9 `, H
        }
! [% n/ _" b8 b    }
9 G' ^1 M' b, F0 U- M4 W7 l}
  R9 B, i1 M- \; D' ]& {
小甲鱼最新课程 -> 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-3 06:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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