鱼C论坛

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

猴子问题

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

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

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

x
大家好!. w# j9 I3 s2 ]" W" E  Q
这几天我在忙着编一个问题,我用了一种方法编出来!
3 i0 N7 P& A& k- @# t$ M但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
2 M3 f6 s* E8 z  v6 I+ v注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ' C! `3 A! g( {7 _* }& ^$ E1 W
, p" v* [$ x. J7 n

5 ?9 ?$ L, t; r  s8 z
                            题目# E7 p  r1 y. B9 ]3 r3 j* \* N- L
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
5 x; }* R6 H3 n$ T) }  m/ J第一种方法:利用循环链表1 z" n/ U7 s! g" u
#include<stdio.h>
/ p0 w4 Q0 l7 F6 c& e4 r#include<malloc.h>
% K* v+ v1 Q7 ~, g# d5 z#define M 8            //共有8只猴子
! l4 A* t* @/ ~+ B#define N 3            //数到3只时退出第三只+ X. Z7 Z: D( \) `
typedef struct monkey  Y5 o$ k- b# b0 X1 J- Y/ @& l7 H
{int number;
- Y3 ]+ p$ b% V, Vint flag;5 b, N$ ~6 Y' ?- y+ C  J. o& M0 _
struct monkey* next;
9 {* r: x: \( Y0 A. p. p}MONKEY;
2 c7 s2 N* D# k( y! Jmain()
3 D5 }& Z# a' ~{ MONKEY *head=NULL,*p,*s;
2 f) }* C1 c3 }9 ?7 {  @  int i,sum=0,count=0;
3 c5 n! c9 U& Z2 s, ?; L3 Z  clrscr();              //清屏
2 Y* C9 ?+ s( @$ s3 _1 j, s, X  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
3 n* N) P9 T* }4 X" X3 r1 E  p->number=1;p->flag=1;; X% j4 ?" \& ]; l1 L, a" e
  p->next=head;
: I* d* N6 f# x8 \- p  head=p;
1 s1 j1 _) T+ m3 E2 y# q/ R  for(i=2;i<=M;i++)
5 W' H/ r; P8 D7 H" w+ q    { s=(MONKEY *)malloc(sizeof(MONKEY));
8 y" K% q0 C: x  J& @     s->number=i;s->flag=1;
% ~& L8 ~0 Y8 p3 S% _! g# c9 w     s->next=head;9 M/ N" ]5 J, f, S4 @) z
     p->next=s;p=p->next;
! W% I' F1 T# C/ s    }
" {( e! J; k2 l# v+ X) {$ C4 P! U    p=head;
& |: F" B2 w0 f7 `$ M7 f8 _: l; n   for(;;)/ j' o* ^+ Z5 h9 \7 e, W
    {if(p->flag==1)
5 X! l1 Z5 Z+ y# V( G3 ^) l+ x       count++;: \: Z/ N7 Q! a- B/ J6 U6 z9 {. n0 P
     if(count==N)
6 Z! D2 K( t) L9 D' L, M# Q3 S2 ?. [        {p->flag=0;
, X2 i6 G2 q. C) p4 w         count=0;3 p2 b  R, e. y' o1 U
         sum++;}# v( P0 O) I6 R- d; c" L+ I2 K
     if(sum==M-1)% s4 Z7 Z( t) E, U' V! O2 t
        break;
/ e2 D- R" j; V, L; n5 ]5 C     p=p->next;
4 x& |2 Q! P/ W, a" s6 b    }8 I# V9 i  j: U: X) o
    p=
# h5 T  X# h7 x; B) Q! N    head;. S2 m, U+ `( t! a5 @* k5 _
    for(i=1;i<=M;i++)
' A) d0 b7 |0 Q1 q2 y6 {3 C4 o    { if(p->flag==1)
* D7 j$ p# `! v+ B6 E        printf("\t%d",p->number);
+ K2 u/ g% V6 |$ g8 Z% ~$ [, U& W      p=p->next;$ B7 E. `' w8 {( d: }4 d- L- t7 g
    }
, Z$ K; J/ o0 I) l
9 i! d3 ?" u2 N5 j# t% C2 F3 w2 ~$ |( `2 U( K4 d
3 n+ C; o- g. U. d" ?% q- }
}
; p# n  @2 l( G9 D+ v# k
第二种方法:数组2 L. C" p! |! L) V. S2 I
#include<stdio.h>
( ]+ k, d9 _- P% s#define M 8+ n5 r$ Q  \7 |' B
struct monkey  d# h" s" W9 l2 U, |7 `
{int number;6 h+ a( ?7 d2 |* H
int nextp;
0 \3 q. [: F& j) F}link[M+1];
: q  A7 m7 A7 [
. y- i5 Y, ?; U3 ^3 G( ~6 J+ tvoid main()
! E; o5 R6 Z: u. _{int i,count,h;
6 ?( ?+ o8 O4 D9 R- v& @8 g' tfor(i=1;i<=M;i++)
- Y, G: {, C8 ~- H5 C{  if(i==M)4 W5 I, v" C  H" h
   link[i].nextp=1;4 r6 K8 T5 v9 X, a4 _1 s3 t
   else5 s( f6 x: q3 [6 ]
   link[i].nextp=i+1;, T" i+ h4 W. l- v3 \
  link[i].number=i;# ?$ g- O  d3 [8 T) K
}. r( Z# i4 k$ Q9 m% |* A, _
printf("\n");
" z6 X; L8 F1 B/ Icount=0;8 [* X, P, }. |0 t  b/ l4 K! R. S+ ^
h=M;& k% r* r) Q0 u. S9 M
printf("依次退出的猴子: \n");0 t4 n) C7 ?6 K, d) T6 m" ]- h
while(count<M-1)1 X+ l( V9 X7 O& @( g6 z# w
{i=0;7 d& y5 X, s' t" \
while(i!=3)
! ?: y5 S: p) P2 j& L; C+ s{ h=link[h].nextp;' g8 B) ^9 a# r0 {+ s& C* u
   if(link[h].number)4 a, c0 I1 ~: c% {
     i++;}
# O! l3 V6 U; y5 d, G$ _! r
6 B: Y" \& {& T0 \: m* L+ yprintf("%4d",link[h].number);
" u0 n9 E2 F* D8 S- Olink[h].number=0;: u& {/ g6 [- C" \  n
count++;
6 y0 e  j4 E  x7 n5 b% D}
, i; G! v+ H1 w  x5 e' W* y4 t( r
$ O$ r! J# }1 o6 O  s! R& f+ Yprintf("\n大王是:");
) _3 R5 `# ^) C6 p2 J  for(i=1;i<=M;i++)
4 D$ d5 y( S  v( x+ A  if(link[i].number)
; T+ C6 y* _" ~0 Q0 n    printf("%3d\n",link[i].number);
3 z! ~: Z3 }, M% l' y6 t; r! f# {. m; M9 I6 y( O' C
; \+ s5 m5 O5 q# i# g$ Y3 h3 a
}
5 |. X1 p( b7 }7 W, T2 {7 q
第三种是普通方法for循环

* c$ Z6 X' @/ G4 Y$ Q$ y! n% a#include<stdio.h>
/ a( w, ?7 `% i* nvoid main()
' V$ g- {% V5 a8 U{ int i,k,m,n,num[50],q,*p;2 W- [7 }! K- U+ \* w/ I3 q  j
    clrscr();
& w- i7 U- S: d. D6 W) n$ \   printf("input number of person: n=");
1 H1 u! G4 x0 e  Y; ]    scanf("%d",&n);
& J( O& d- F# C8 N1 K" R+ Hprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
$ h* I& u) x& f5 u  Z7 Z    scanf("%d",&q);
/ q% v% |: O. `2 V+ Z, P( T* k6 Z   p=num;
1 f: z: G( _4 Z9 [( v2 T  for(i=0;i<n;i++)+ G3 l: E2 g/ T# y( p5 Z
    *(p+i)=i+1;
& g% ^5 W9 y; P% q( a5 V1 \   i=0;, N+ S3 |/ {/ N8 O; h
   k=0;  _( i$ q( j* `0 ~) S4 ~4 h
   m=0;
$ d7 @% U+ h6 u2 i% n9 q  while(m<n-1)" U# k* Q  ~2 p
   {if(*(p+i)!=0) k++;
, w  l& W" h# K7 _     if(k==q)* u+ }( z, P: G4 y8 e3 E
      { *(p+i)=0;3 f- R; p7 v) h* @/ L: c
        k=0;% C$ q# z  S0 q# K
        m++;
. H/ Q( H/ U- T1 i7 B1 @8 V( ]      }
, B3 O4 ]& P4 v$ ^  |* w+ h    i++;  u$ D$ y  Y0 @) K; I
    if(i==n)i=0;5 Y+ |0 \) N& e! \8 B  h' z. j
   }
& L0 a1 ?5 |$ ^  while(*p==0)p++;( W5 B* V" [% g6 g# x
    printf("The last one is NO:%d\n",*p);
' E1 h' x$ c/ `4 V. }. m1 N     getch();
) `: o- P9 p' Y8 c/ O  k7 _8 A9 F" ]& F
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
! E% e# ^, v, e' Ynamespace 又费马达又费电: W; X0 R0 b5 m
{
9 u- W& y' _4 w: w: P/ G9 E    class Program
' ]* q5 {! q+ H; ?    {
9 {7 s$ X4 m3 a1 a$ j        static void Main(string[] args)
4 ~6 f, P2 m: X( K$ q        {* U# \; l/ O  z& k: x; A% R
            int m, n;" E9 v$ N& e" g; J6 Q  U
            Console.WriteLine("请输入数组长度");/ c2 B  x6 l2 l1 o
            m = int.Parse(Console.ReadLine());//m为数组的大小
9 Q$ v' B( {2 R: K# g; }  f            Console.WriteLine("请输入要截取数字的大小");
9 a! [: Z# q. C  l% y            n = int.Parse(Console.ReadLine());* r  Y9 y* C1 S! z
            int [] numw=new int% o3 E0 z* \) v5 c8 O

. U! `* C/ n6 q&shy;&shy;&shy;;
; W* ^/ `& Q8 l+ ]! I' r9 T' t6 j% s7 @            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
7 X0 c" @: s# ?( i% G3 C' H6 I            {' W$ M  b9 J8 Y6 h2 A6 Z" @; f
                numw[j - 1] = j;" K$ Y" z7 `" X! N) G
            }
; k5 p/ P" G2 J' l2 i) ^) k+ x7 p            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
& ^9 v* w1 J0 F* o7 l            while (d != m - 1)
* H3 g5 ^1 ]; _4 m            {
7 W1 [' I' T" C2 Y% u# `                if (i == m && d != m - 1)
' u; ^" M3 O! Z$ Y8 b% L7 i                {' R# F) _& k0 y+ s9 ~6 l/ y( S
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!9 `) ~6 v% ]0 f+ v$ D0 x7 u; J, f
                    continue;* r! d1 v5 h1 ^. y& l
                }
2 R, i- P- v: l  |                else
% O; B, K; y/ x5 W, N                {
' [; T& E/ J+ O, l! l                    if (numw[i] != 0)
1 a1 Y' b# S) N: b& p; K& C; g                    {
$ g: _2 B  I& e1 u                        i++;1 E  [/ W0 T& M5 V% n. S
                        k++;
) R4 j; K- }) R' q: z, E+ G                        if (k == n)
" H: z9 j1 j8 e8 y6 W/ H2 v                        {7 b1 V: }" ?2 v! @$ q
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
4 P& R2 {2 A* e+ n5 m1 f                            k = 0;9 P+ S( q3 z( B7 r) k8 O
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1# E! h) X- F- N- B/ L; b
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);  i$ ^* j. I! V2 F
                        }" ?( z* e" ~9 |) w' d8 u8 G
                        else//输出暂时还没有改变数组元素的值
$ ~' N5 J" E& g; B' s, @' J$ Z                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);0 V% {- p2 F) n: T2 o* N& i/ B
                    }
, a4 q2 Z! U: o4 b                    else
! W0 x8 g' \- U) d7 S" c2 M2 \                        i++;//数组元素为0,直接跳过,不计数。。。6 f3 r+ u0 a9 Z0 A9 w
                }$ s! b$ M0 u4 V$ K6 Q

& [0 v# U; M3 f! v+ K4 v( I# p+ A9 D  C0 ~# O, d
            }//结束while循环
) L; r6 l/ f" I, Z2 ~            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦* ]0 ]" f- U% X" C" t' ?
           ; X* G- U5 z7 m
                if (numw[i] != 0)/ `: k0 i* B3 x  Y
                    Console.WriteLine(numw[i]);
9 O) N8 l6 s. S8 m5 t           
6 T# B1 S$ S+ ~7 r5 ~! Q            Console.ReadLine();! s) C- l7 T; h' V# J1 j( o
        }
; R, O& U/ x- v2 r; }    }/ h7 D- o' z( ?" _0 q
}/ y; a* e7 _6 ~/ G7 z& _" j
小甲鱼最新课程 -> 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-2 01:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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