鱼C论坛

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

猴子问题

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

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

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

x
大家好!! H1 k" W" Z# [8 r2 @
这几天我在忙着编一个问题,我用了一种方法编出来!) |/ }" q- f2 C8 ?
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!. I. M: G4 \3 ^  ^! Q
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 " \, V3 b6 X; k/ P. p3 [* G0 I
* ^" b: o. E$ i
: {4 x" N9 m. G4 ]% X
                            题目# C; b6 a" L% G! |% B" P
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
4 t6 F- s) C4 S0 U$ I; |第一种方法:利用循环链表, ~% V& d( {0 o' \/ J
#include<stdio.h>1 x7 V6 R4 a" O+ c4 N" A3 |  S4 V
#include<malloc.h>
9 x. Y' v: [3 o# i8 e#define M 8            //共有8只猴子) i# i# r& e+ \# V
#define N 3            //数到3只时退出第三只
& c6 e9 \. F* R* z) Ptypedef struct monkey  j+ x% U( ]' b, ^" J- ?# S9 `7 D
{int number;* |* a' u/ b0 y( [: s# P% l$ m
int flag;- }; b2 H7 h2 u& X4 U* ~% ^
struct monkey* next;9 X% [8 h$ _: C' @
}MONKEY;5 X, r/ _" i' g& \' d  l' X$ d
main()6 g6 M1 |+ Q% I9 z& b. w) z
{ MONKEY *head=NULL,*p,*s;$ f5 n# p# ^0 @+ D) ]
  int i,sum=0,count=0;1 h  U' E1 _7 N+ S7 |) }* M3 ~( X
  clrscr();              //清屏- a( [+ o. \6 m6 S7 Z( X( e( a
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
3 U' W& p" X% Q  p->number=1;p->flag=1;
& F& C) z1 I3 Y% h0 r! g8 d, V  p->next=head;
! c4 ]: T! _& V; j8 V* R. j  head=p;+ e- J1 Y7 A3 V  _4 F
  for(i=2;i<=M;i++): h3 j. l* d$ _4 Y" t& J( j' x/ F# \
    { s=(MONKEY *)malloc(sizeof(MONKEY));
" {; ?2 D; L5 U2 K- o  u     s->number=i;s->flag=1;0 G# ~0 C4 H% l& h& d; y
     s->next=head;
7 O) v/ ~+ _* l) y2 m     p->next=s;p=p->next;, T- |: g' Q( @; x) Z7 l$ _
    }
; z1 \" ?3 T( H3 w8 P    p=head;& x$ n* ]2 H$ _8 _
   for(;;)
9 ?' A( `" x8 p    {if(p->flag==1)0 j8 L$ R( p! `2 [9 _4 s' I6 o8 G# T
       count++;' j/ w% P; U+ g7 T# |0 g
     if(count==N)
5 {% k- v) K# F8 m# {# J4 _        {p->flag=0;
8 I9 K- b2 w! V# |5 Z: `  m         count=0;4 _, [. x& R0 v
         sum++;}  D0 \- y- E0 s# Y
     if(sum==M-1)+ W/ c# k$ A+ o1 ^
        break;3 m% v/ [0 @  G* [. f* l
     p=p->next;
' B& Y1 r3 n( j& [; J    }
# L! Q6 U% q9 a4 U7 c    p=) A5 x/ F% \: M, l4 x* O
    head;
5 k. V* V6 |1 ~# r- C8 C5 e    for(i=1;i<=M;i++)
% p& C7 u: b; D8 B& P    { if(p->flag==1)
1 V* T* c3 s' l        printf("\t%d",p->number);
! [( i/ j) A( R      p=p->next;4 ^3 ?5 b, P) ?2 E9 |& S. s5 h/ J
    }
/ c/ ~: ~# J8 r/ Y: ?0 u
2 e" I8 X% K2 ~- G! n
- X& |- p6 w$ c6 `* c" w/ W
! `  F0 d% E/ @  Q$ \  U}

0 J, H/ X& J4 x8 x+ ?& p: T第二种方法:数组% k* I  E0 a' n# t
#include<stdio.h>0 Z+ E. r- P) b7 H' M8 _# K+ p
#define M 8
" P: ?0 l2 M4 g4 b. gstruct monkey" w, ]- W# w; Z" M: I/ y
{int number;* f, v8 k) H4 t4 J
int nextp;
, j2 E8 u1 P: @$ V) J}link[M+1];
3 I6 J# F. [' c2 r
' q! m- ^7 C7 E, B( \, \- d* T% Cvoid main()
3 |! {+ T* n" z0 D- H8 i{int i,count,h;
8 p+ s) \! z5 k, {5 l+ i; Wfor(i=1;i<=M;i++)- i$ e' z* Z2 g6 G# F
{  if(i==M)7 j2 N! |% u' E5 a" x) H" d
   link[i].nextp=1;! E4 D$ F* P; E( W
   else" R/ v, M6 j/ w5 |1 N  Y
   link[i].nextp=i+1;! ^! Q# d: g' n" @
  link[i].number=i;
1 ^- H" Q, \, ?% D" U) l: }}
& \( f5 e6 P# j5 }printf("\n");* n  X+ [9 k' _; H" @% ^
count=0;7 o' [* K1 h# q* i, S  P/ A) g
h=M;
% ]  Y) X) P* w" B4 V& mprintf("依次退出的猴子: \n");
3 F; `/ f) W% [$ D  B! fwhile(count<M-1)
& t. ~. }- [0 O: I' K1 M{i=0;
1 ^0 p- N) F, Zwhile(i!=3)
; n0 V6 ]# K. D1 M" V% X" K( t{ h=link[h].nextp;3 }9 u1 E' n( K( ~; t% F/ f8 ]$ W
   if(link[h].number)* Q: k! s& a; i5 F8 _
     i++;}
5 j# E, _, Q9 V% ^
' e3 k- ]- I( ~, k& ~- z' L! V& Q; F) u  Eprintf("%4d",link[h].number);" a3 h# u3 E* a/ g7 o# ~
link[h].number=0;
; W" j7 \/ w. f' tcount++;
2 h% U# M. N# {( `$ q}
" Z  W  U$ H# f6 y+ ~0 b' j( Y# b9 ~& a+ `/ q; e
printf("\n大王是:");8 _( u0 B$ U) n+ {: R/ M) L
  for(i=1;i<=M;i++)
/ K3 Y# P3 i$ Y$ c8 [1 L6 [  if(link[i].number)
# \1 V, |  z, O& }$ h9 `! b1 Q2 g0 y    printf("%3d\n",link[i].number);/ `$ q% a" ~8 t5 {; _3 F0 y

" b. g  K3 ^/ P' b/ f) N
: z0 w# ?9 [# a, x2 q3 ]}

: W: q7 p! W$ ^6 x: F1 `, A1 b3 S" l第三种是普通方法for循环
' V& D/ t1 ?8 T2 r
#include<stdio.h>
0 o: ]4 g+ M0 H! Evoid main()+ w7 j7 M2 O, ^! G1 N
{ int i,k,m,n,num[50],q,*p;
) X: r$ r+ J9 d- f- g9 F5 p    clrscr();) B! _# K+ x& W3 x6 x7 k
   printf("input number of person: n=");
/ r5 z5 {' d* D1 @' n    scanf("%d",&n);
$ M4 M5 r8 [3 J# e  Yprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只, g! U8 {% _1 q9 Q% r6 |% R
    scanf("%d",&q);
) p+ b6 \% G" ]$ r; Q   p=num;; r( M3 r, f  |
  for(i=0;i<n;i++)- q. f+ r( |7 c6 l7 C7 j
    *(p+i)=i+1;
/ O) n' P7 h3 M- c- j   i=0;
9 W( L  X$ \# M# ], J   k=0;
0 D* J  y  A  D- [0 e6 z0 b   m=0;3 A$ o' k+ W7 y! N
  while(m<n-1): ?6 D# e; ?. ~7 r+ g
   {if(*(p+i)!=0) k++;1 c" d) _, \/ Q$ E1 r
     if(k==q)
) i: Z  Z& s0 [: j      { *(p+i)=0;
$ D1 @' e9 ]/ k6 P# ~( |  Y' ~        k=0;6 m, i% ?# D5 n: \% [% B8 u( i
        m++;* {: q6 T" b2 U. w
      }$ z+ L$ G9 i& p& C' t; O+ m8 U2 F
    i++;
5 k* f$ I) B1 P) q# Q6 e    if(i==n)i=0;5 B( M1 T4 a5 @  [$ l
   }) `, \5 M# Q2 N: W* u0 B
  while(*p==0)p++;
( L$ k1 |+ F* \7 n4 n1 s  F# t    printf("The last one is NO:%d\n",*p);
. x% ^/ l) M* P8 `/ H, v     getch();0 X7 c& J9 ]3 L, P, [

- N* Y( E, U! t, m5 ]/ w}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
2 [1 x0 t/ l. q7 f& |# qnamespace 又费马达又费电4 m2 g5 F, C0 `9 z2 r9 w
{
  j5 w$ }8 b/ x    class Program
' j" g0 e- |# V    {
4 C. W7 D4 {8 w! J7 m        static void Main(string[] args)
4 Y+ [0 W  F' B' V, a: U        {
+ g! Y8 ?) L" Z( D; F, L9 @            int m, n;
" D& l  R7 z9 @3 A3 }            Console.WriteLine("请输入数组长度");- L/ T5 c0 |% Y3 c/ I0 u
            m = int.Parse(Console.ReadLine());//m为数组的大小
1 N+ x) c8 g8 q; {4 p9 p3 l            Console.WriteLine("请输入要截取数字的大小");
- n/ H- x. d: l4 r" A            n = int.Parse(Console.ReadLine());& O8 Q. ^- V& g' y
            int [] numw=new int! Z5 x5 F7 t  X* ~

1 b% f3 y4 C4 Q% x: p$ ]&shy;&shy;&shy;;  `( ]; v% Z1 E& a+ G2 s
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
8 n$ }% n5 y) S; n" k$ }            {2 o/ U9 ^; }' G: l% U2 q3 D: d. `
                numw[j - 1] = j;
/ J7 V3 r" v" j- \            }; y7 s2 a( p; }8 r6 d% N( d
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
1 M$ Z  Q4 ~) D- |4 a' S3 k            while (d != m - 1)) t9 A9 \) B5 O8 Q
            {
4 r( G# d; F( V. O! X: v                if (i == m && d != m - 1)! W! `% ^% f, ~$ J+ I
                {
* S4 s# P7 k' r2 }- b# k1 s                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
9 P8 H) R; q; i+ Q$ a                    continue;
- z" Q* Y) I3 k. i3 S                }: A  B+ N" d) X
                else
6 y6 y; l8 Q$ C7 |9 X                {
5 J( P# p  c* h& c2 B: B                    if (numw[i] != 0)
' c* m8 z- S; g5 g* ?                    {3 W/ v# e: \- K5 }& U
                        i++;
; \% J5 y8 J7 a# ]  Y                        k++;
" b! T, ~9 `0 ^" j* [  R                        if (k == n)
/ b% d3 ]* t3 y. h; O7 y                        {3 |9 k+ X% F' S5 ?' L" C- T
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
1 S- v5 ?) f" ]1 G$ a0 s                            k = 0;
0 L% ^" D. @  k+ g0 k              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小19 Y- N/ {. ^9 E1 M' H" l7 I
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
1 u" T, Y+ l/ l6 M8 l                        }! j$ t$ k, d9 k
                        else//输出暂时还没有改变数组元素的值9 Q9 h5 Q+ m2 S" K6 e
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
* b0 R* K# C2 E                    }# T8 m, f  ^( d3 x: s. y+ V& B
                    else
( N( w  j5 A' G3 m, O                        i++;//数组元素为0,直接跳过,不计数。。。! x) R& Z# J7 b
                }& x+ I( ^6 m; w5 V! A2 y* v
! L' f7 I, k0 ]$ I+ N8 W0 _9 T
2 L; i4 V2 x0 ]2 I& A% i
            }//结束while循环: V: g8 f8 p$ w( y) i& A; l
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
# L9 H7 L5 U' I: v, d1 E* {/ c- l4 g           
9 @2 a$ W+ ?( B1 J  N                if (numw[i] != 0)% ~4 \6 P4 l% c2 P5 b9 m8 N' g# }' s
                    Console.WriteLine(numw[i]);
+ L( D% T* u/ R/ e2 k           ( W5 d) e% k+ w
            Console.ReadLine();
" E8 W2 z6 j( u& b6 A% X$ C9 a/ B        }. W, V& I* E- J2 c
    }  b% F& _0 [1 B0 b( [7 Z
}$ v  `4 }: ~) o9 q+ |4 e$ K
小甲鱼最新课程 -> 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-11-10 15:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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