鱼C论坛

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

猴子问题

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

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

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

x
大家好!" H% E! u9 A4 p+ n* h
这几天我在忙着编一个问题,我用了一种方法编出来!
' \, [1 T& `# U3 y: \& T但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!& D3 g+ Q! _+ a& `3 ~( K! P$ r
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 0 l. f! Y9 `# q/ @. E

* L: S' |/ {6 @' i* P
. M% U0 j, `( Z/ ~! `8 r
                            题目
  x2 c; C& p9 P! M1 c* x; S山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。$ A+ r4 ?8 C3 {( A
第一种方法:利用循环链表0 G7 |1 `0 u" I# V( t2 i
#include<stdio.h>
  v: Q! X! c# \8 W#include<malloc.h>2 o" S% c6 r% j0 y+ n
#define M 8            //共有8只猴子
% c$ Q: Y* v  B% t( p9 S#define N 3            //数到3只时退出第三只
' j6 ^& o/ t6 u3 Mtypedef struct monkey
8 w+ U0 f, I. v2 A/ C4 t{int number;7 E9 a$ o; i: |
int flag;5 i: f" ~1 [! d* H+ @
struct monkey* next;
/ ^. o0 X. y$ z}MONKEY;9 [1 E' _8 A8 b' C
main()0 z2 ?0 ]& H" n9 D, ]% _8 ]
{ MONKEY *head=NULL,*p,*s;
$ z/ {* W/ L* B+ f% q( h# {  int i,sum=0,count=0;  ], g4 V- x. V4 [2 {$ m0 q
  clrscr();              //清屏) f! C9 @5 F# j/ o$ I2 F/ V5 C, E
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存7 `# n8 Y3 g; i! X+ M) ]; C% q
  p->number=1;p->flag=1;
% M: i+ Q! c. n( e  p->next=head;
( R! ]$ f9 a6 K. U  head=p;
; L: b6 x$ o. D9 E6 {  for(i=2;i<=M;i++)
# Z1 H, Y5 |$ A    { s=(MONKEY *)malloc(sizeof(MONKEY));" O9 e, K, Z$ J) j7 m0 z4 w
     s->number=i;s->flag=1;
( C9 X) R+ m* {% @* Z     s->next=head;
: k( N$ G6 O+ z% Q     p->next=s;p=p->next;
% |* M% O- S9 e3 M6 H# h6 ?- u4 r    }) M' a; V8 }$ b4 K& z7 i
    p=head;
5 p  ^' u" G9 g1 n   for(;;)9 X) Y- x& F& u3 s' W1 _
    {if(p->flag==1)
" @; W; k# ?' C  e9 O       count++;
/ u' R8 N5 \. F5 O, T     if(count==N)4 N8 A3 q% j0 P* P5 k& Z3 \
        {p->flag=0;3 X% i1 w: s" E
         count=0;+ P; u& g% q8 @! T' ~
         sum++;}2 o, K  x/ s* @5 I
     if(sum==M-1)
9 K7 [9 J; p% e" b% X& u        break;  D& t* k3 t- N$ B2 O) Q: ~% \1 P
     p=p->next;7 {- d) t) W8 \# N1 @' V1 x/ E1 i
    }7 A9 [3 H. H1 B/ X6 E
    p=/ y: D3 m$ c+ h% m6 y6 ~
    head;
& a6 C7 F, K3 L    for(i=1;i<=M;i++), y  _& k8 n% C( Z+ D6 \( B
    { if(p->flag==1)0 @8 z' ]) c  H3 c+ t1 l
        printf("\t%d",p->number);5 m2 u0 q! z  |
      p=p->next;  [, k  L4 _) @9 b4 E
    }" s' k' |1 G  n# m& k; \0 ?
& ^5 ?4 [& U& x# H

& L! F2 j0 j+ X  L
& q' U4 j6 W8 Q' E}
( J  _% e/ ^# f0 n9 d
第二种方法:数组
% l. H- Y- K4 B#include<stdio.h>& ~9 k# n$ w  _9 b8 i0 y' f
#define M 8. K( e/ |, B8 Z# W/ i
struct monkey5 a1 Q: W" ^& U+ n9 E; q5 F
{int number;  H# w* i5 C8 q6 l
int nextp;
# r% t2 y( |7 s, _& }' A2 a: C}link[M+1];
8 L& o7 [  `  b4 U, G+ }" W2 h1 v
void main()% h% v. q8 o0 z+ H
{int i,count,h;
, K( E! O7 r# `$ ?" j  wfor(i=1;i<=M;i++): D) H. G0 [3 X* n9 R% X0 o
{  if(i==M)0 a& N7 w8 F$ {& R0 K
   link[i].nextp=1;& W% ~5 @* P; |2 S) V# J  j+ T
   else
' {! |5 L6 s. e* o+ s( p0 n   link[i].nextp=i+1;
2 s' y7 [" o, I* j" v# T3 Q3 G* v  link[i].number=i;6 }2 }# t; v3 ]4 g
}0 L! A+ M7 n: d3 O) `' ?
printf("\n");
+ \: R$ T/ W& z: A7 W+ X* qcount=0;
+ ?- Z$ @" [4 ]" u- R4 F2 ]3 hh=M;
' E7 F9 e( h* Z8 q: O! ~printf("依次退出的猴子: \n");2 Z. b1 n, {1 [8 G' Q9 S7 q
while(count<M-1)! n2 m7 \: q: i: ^
{i=0;4 n$ ]; {5 Y* \4 O* Z  K/ r
while(i!=3): H6 x8 T# q' Q  }( f0 |1 q5 C' G
{ h=link[h].nextp;
/ `% j; {2 a. {4 y# F   if(link[h].number)3 G* c! O5 D* K: }
     i++;}% o2 T" d) r) Z0 ?+ l
; c: x6 s0 |, z, o# ?) a
printf("%4d",link[h].number);
4 n, M; i) o+ b" M+ Q/ g! _; Glink[h].number=0;
' V0 ~' A# c3 ^! I) I; B' wcount++;# Z- W) _2 [2 J
}
1 O8 A3 w) m0 {7 M
+ s2 \4 {3 Y3 z6 s/ xprintf("\n大王是:");
, M' z/ g/ W* a  for(i=1;i<=M;i++)# w5 A6 T2 K' p, U3 j9 B
  if(link[i].number)1 b, p' Y' o! Y1 }8 G1 S- ^* x5 ^
    printf("%3d\n",link[i].number);
1 g7 D7 ]) b$ U; s* `
; |! [& p( N" Z+ y. g# T! m% ^1 D; j$ {) A
}
" h2 a5 k- z/ U0 ?, ]$ v7 L* v
第三种是普通方法for循环
0 k, }, e- O6 Y4 P6 ^5 b3 ^3 J, K) S
#include<stdio.h>% o, F4 s3 M, w/ N
void main()3 c, h! t1 _; S6 l8 U
{ int i,k,m,n,num[50],q,*p;
2 G. W% u4 r0 Z7 Z, k    clrscr();8 x6 C0 e# ]3 M- i% V
   printf("input number of person: n=");
! J1 c* L+ I6 i% v    scanf("%d",&n);7 V- T6 k, J* J! _7 b0 s3 ^! B5 U9 m
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
5 y  U; B- N0 L    scanf("%d",&q);- X) \# L# R7 t0 p, Z2 N
   p=num;' c9 F4 {, \+ ]/ e
  for(i=0;i<n;i++)2 g8 l7 G. }: }% g( W6 W; t
    *(p+i)=i+1;8 R7 j$ d7 h: T3 @
   i=0;
( o% {0 q& z9 F, K   k=0;6 c0 a  R; u" z, _  L
   m=0;; _& v" F# C% B" m* W( a
  while(m<n-1)
1 M9 A& ^  ^: }" h   {if(*(p+i)!=0) k++;! s( L$ @6 A  M& Q: e
     if(k==q)
& m) N) `, {# X1 q: X      { *(p+i)=0;
- j9 U9 }) ]5 g+ N        k=0;) e3 S  L5 k/ h. s+ L
        m++;6 s, o, \; ?# S7 }
      }( g2 u+ a0 p& D; z* W
    i++;) n% z, u/ G5 _+ X
    if(i==n)i=0;2 V/ _+ d% f9 f5 S6 a
   }
, D+ f* R/ d" P! c' y1 Q  while(*p==0)p++;
) N% M: Y% q4 T) }6 s    printf("The last one is NO:%d\n",*p);9 k% v- B2 R5 W0 H9 h+ L+ o0 v
     getch();
3 z# @: ^- g4 c: C% b. K
6 K0 L* E( B% f7 U}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
# U; K; K- J: m) Inamespace 又费马达又费电3 y- S- V) _, R  ?  c
{5 Y( v% d" M* U9 ^0 p
    class Program& p4 H$ `! K, t. C: R- U+ ^
    {; m  F& J3 `4 P. u  \; B5 R
        static void Main(string[] args): i1 K) t: u, e, Z+ G5 e6 x# E
        {
* k4 q' q8 O; r            int m, n;
5 m3 x* A, B2 b( }' q2 H; i. u# v            Console.WriteLine("请输入数组长度");5 ]7 E& G/ \$ K
            m = int.Parse(Console.ReadLine());//m为数组的大小
- n9 @7 x7 D1 j7 j            Console.WriteLine("请输入要截取数字的大小");; c0 @7 A$ {1 M4 R; v
            n = int.Parse(Console.ReadLine());
- H# w* O: y# A& U6 c            int [] numw=new int# b7 a6 l/ l* p8 V/ G2 u6 e8 U
* w, \/ M- [: |' ?2 o# q
&shy;&shy;&shy;;
. T* C! v" J* x* m, ^5 n            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数6 n7 N* m' A, B& r  V9 `3 z/ t1 l
            {. e0 E$ z* l* F1 P0 D9 [
                numw[j - 1] = j;
& U, S) b* M; R- e# [$ A3 S            }5 |3 a, I# z9 k, N" |
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!1 l$ q3 ]; g% T% i
            while (d != m - 1)
3 J9 H* W& {8 X7 u8 J- G) x1 h            {! n+ o; n7 w$ a/ I0 M  x
                if (i == m && d != m - 1)
1 t2 k3 y  L, ~, a% i/ }3 x                {
5 G% e2 n) |9 m3 B  O                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
6 N: w9 N% V7 Y, y7 S3 ~) K9 e                    continue;
; t0 z$ Y3 q5 m  K. S6 G2 ~                }
- N& {& f: ?  v8 D$ x0 g5 @+ {' U                else4 T4 S7 B; e; h8 z) X; x) D
                {" W0 g9 g; n7 C5 N: c
                    if (numw[i] != 0)8 ]; a" l% v2 N; H
                    {' k$ s' ^1 f6 u5 }- x* }( b( j
                        i++;! J; b2 u/ I% H8 u% Y( s" ]. V
                        k++;
3 P2 a! u" s0 F+ K3 S6 t* f1 b                        if (k == n)5 o  d1 [6 y' j- g2 ?8 |
                        {
( X9 R0 f% c2 u0 ^8 M; Z; h9 N* i9 z5 [                            numw[i - 1] = 0;//把在n位置数组元素的值改变了. Z% T% c% M. U( ~4 i8 x, a
                            k = 0;3 }/ d$ x5 z  U! e' y% |0 G
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
& I0 s8 s; @$ l/ i5 B                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
8 N2 \4 A( g$ w' @# Z' W+ g                        }
# e5 q0 J8 e" a* `                        else//输出暂时还没有改变数组元素的值
% Y# U" x- [6 ^                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
# G& Q: F9 N' p! j" J2 v                    }6 h& q" h1 O; U
                    else
0 P4 m* V: `, b/ C5 P$ H# v4 `                        i++;//数组元素为0,直接跳过,不计数。。。7 w5 @: z8 c2 I6 v9 `
                }' H' s+ h: a; J/ D

6 q9 E; d1 Q- w+ Q: h) Y" [
& t" h! o, K3 N; }# Z5 E            }//结束while循环
* t- n, t2 [9 e, [9 {            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
0 ^; l% M. V6 ~           
( E2 W5 ^) Q3 \$ t                if (numw[i] != 0)% ]5 t  z2 N+ C# Y8 _3 g7 p
                    Console.WriteLine(numw[i]);# ~; v2 Z% g+ q
           
$ f6 B3 W3 s+ O' g# \! p            Console.ReadLine();
" o$ c  |& A5 j. n        }
2 X  d8 `( L: j    }
, O+ d' ]* l3 K1 k, P}
, n5 s5 G  s& I1 Y. h& R
小甲鱼最新课程 -> 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-4-26 12:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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