鱼C论坛

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

猴子问题

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

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

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

x
大家好!
+ m+ ]/ h# Z4 \$ f" v  E# @这几天我在忙着编一个问题,我用了一种方法编出来!+ N/ `" I  S; h
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
3 F$ L% b) I+ p. v5 Q$ r注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 # h; `  ?3 }3 {; L

* n/ q& i* R. z- K9 {
% `9 @1 R1 J! Q* B% ?, u
                            题目
; N# F  \" q- M山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
9 F9 }+ P4 T# N. D2 E& m7 g* m5 w第一种方法:利用循环链表
! e# \' D3 S! c1 T; v#include<stdio.h>
, n7 m+ y( ^( q, j: [2 E8 `7 g#include<malloc.h>2 d+ X/ G9 q/ V' r2 u7 f, ^9 l
#define M 8            //共有8只猴子& j" ~* `) w& y1 U5 {4 s
#define N 3            //数到3只时退出第三只4 D. k1 D5 ]9 T$ n) z5 ^
typedef struct monkey+ d! }5 y: W" Q/ d# T6 r" h
{int number;
. P# {! e3 M7 K; @! Y6 a% rint flag;4 r4 C2 t; A( W% O  v; A3 y
struct monkey* next;2 c8 E; b' N: F3 ~$ u" m/ U
}MONKEY;
( H( P$ x/ |: Amain()
6 n1 [( |3 @* D+ {7 @7 ?1 i{ MONKEY *head=NULL,*p,*s;
. z/ Z( T$ A: H  int i,sum=0,count=0;
7 u6 X+ ?5 T3 T1 H( `6 ^2 f- F2 ?  clrscr();              //清屏
0 c0 V5 O/ f3 X2 p0 p# E1 G" z  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
' i5 t" |: Y8 o+ V( c  p->number=1;p->flag=1;
9 s) k( M1 E4 z. M# U) A+ C+ J" o  p->next=head;
( D0 p7 b$ t9 p' ?/ x  head=p;/ t  X, R# l/ q7 A( E6 a
  for(i=2;i<=M;i++)
8 P) X3 `4 p6 m9 D. h/ J* V; B    { s=(MONKEY *)malloc(sizeof(MONKEY));
7 ^7 H+ n4 I5 H5 S0 ^     s->number=i;s->flag=1;+ r/ r5 Y; i) H2 i
     s->next=head;0 T; z, V1 N  ?" ~0 m) N
     p->next=s;p=p->next;
* c$ v6 M5 ]4 x. W, b' f    }# R# u' k* [  X7 `! d
    p=head;
# x$ V* L8 i* m! \' |+ ^   for(;;)
2 i5 `2 c+ r$ A6 H+ z8 M$ {    {if(p->flag==1)" e, R) g9 V4 o) ]6 Q1 {0 ]; D  V
       count++;3 p4 a* t% x# P5 f; w3 w
     if(count==N)0 q$ _' g- D4 Y) q0 C5 c# l- r( j
        {p->flag=0;
* @. R: N8 ]) [$ Z         count=0;
- g& s8 _, H- q$ x. B$ `; @/ C2 s         sum++;}8 i: C6 L: r( e( `( W1 N% C
     if(sum==M-1)
: P$ \( e4 j: d5 a        break;
8 Y8 O7 D1 Z6 w  l. x" G9 n4 P     p=p->next;
- K8 i* |6 `( T    }/ E& k1 x9 j/ |6 g1 N
    p=
/ e. M' `/ k; H$ C. M    head;
' f* s  {0 o. y9 c    for(i=1;i<=M;i++). F+ Y" X, a+ a) `  J" A
    { if(p->flag==1)8 U: D. s& `  e$ l4 O
        printf("\t%d",p->number);
$ w* I7 t* r; r& M4 R9 T6 T      p=p->next;
* Z" }; t' N& e, O5 _    }
) ]# m: g! [, y3 r3 ]9 f
7 k; I5 q+ V/ l0 n; W
$ L7 C% l- q% w5 y% P: T) n! t6 m
# h4 B( u2 {7 L/ e" F4 H5 y) W4 P}

$ v& H. U; r" e8 u, p第二种方法:数组
$ T4 S1 N- F" K, z: b* N#include<stdio.h>
9 W1 T% G: d8 b# t. A5 Z4 L! w#define M 8
9 e' f8 e  @* J% y* Qstruct monkey
2 U$ l" s+ G! p% r{int number;1 N9 K9 z  D( g) }' G9 E# V
int nextp;6 ]! _  r) W+ Y+ d6 K
}link[M+1];9 }* ]: B( B- p0 I8 r. B- ?# s

% p* L8 a3 S# `2 yvoid main()
; \8 g& _/ ?1 a0 l; ~" f{int i,count,h;
. q5 S( ?# Z2 y+ pfor(i=1;i<=M;i++)
+ J6 W+ g& K7 z5 y5 b9 k5 H8 I% e{  if(i==M)4 J6 C8 k4 A. O. j1 \( P
   link[i].nextp=1;
, r3 B4 p$ j5 `2 v# O6 k, E& T   else
& T4 c4 I9 ]) x0 W# e   link[i].nextp=i+1;
, x* {% M: S+ \/ Y/ g6 i  link[i].number=i;
; ^0 I2 ~: ~' Q; _}
& }5 ?9 v' ~, a0 Eprintf("\n");
, [/ `# b- }5 e4 r9 _count=0;% M- E& _0 @2 e( X
h=M;7 f( f' Q1 ^: r/ q) |
printf("依次退出的猴子: \n");
, R% g  i- F% U' [while(count<M-1)% ~7 q! K/ q0 X, ^. R
{i=0;/ U+ }, {. u- h. x6 `1 V
while(i!=3)
: C5 a6 {( ~0 d5 Z. x  @/ o{ h=link[h].nextp;
* k2 r9 V4 f3 A. Z- r   if(link[h].number)
  f3 U- o& N) r% d     i++;}0 O! Q# t- N2 t& J$ @/ l# \

" f- ]1 a3 @3 E' m- I1 o" Lprintf("%4d",link[h].number);
& }! Q# w+ a5 B% p% e- ulink[h].number=0;
5 Z$ E7 N3 J3 ^* }3 ?count++;
( u6 s& L0 R+ j6 d6 G; o" _}$ I; e# ]9 z) H$ B$ Q% d
. |# y' \- W* o3 m7 b0 k9 W# T
printf("\n大王是:");" }: @; k0 N. i0 y7 w9 |5 ~7 k" k% T
  for(i=1;i<=M;i++)3 Y* e. g3 o  }2 p' m
  if(link[i].number)
  g- J9 Q1 |0 s8 \9 z! k( `! S    printf("%3d\n",link[i].number);
1 u; e3 g$ @* M: m2 n( p" M& D: z  s6 Z; v$ Q, ]
+ O3 O9 j  l) I0 A4 M# J
}

! U- q  o. J9 {% M$ }$ H第三种是普通方法for循环

0 Y% G8 Z9 n- E+ T) B#include<stdio.h>
% N3 S5 A* p; T0 Ivoid main()
0 `$ }# G* H" w6 d- D{ int i,k,m,n,num[50],q,*p;/ O  o7 }$ T4 N" h/ h
    clrscr();1 _8 P" x, _* ~/ f6 p" ]8 k
   printf("input number of person: n=");/ G' M0 C5 E4 C4 I# B$ Q( K
    scanf("%d",&n);* i5 O8 C. U" w2 A& K$ ^
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
" h+ Q) E( V5 m0 @2 C9 `( K$ W    scanf("%d",&q);) m# z1 |  X& B) ^- V! N
   p=num;
) {' S* Y1 S6 E& i  for(i=0;i<n;i++)3 h: J+ c8 B- X6 G& h: H  ^7 C1 S% a
    *(p+i)=i+1;4 w) F' v( R/ a. C7 v/ k7 e1 K
   i=0;
) _! o" l! J, R, o; Q) I   k=0;
2 g/ x) }6 e3 ^/ Z3 t   m=0;
" c/ j/ g9 i/ O4 w6 T) K  i  while(m<n-1)6 Q6 s* a  v8 }
   {if(*(p+i)!=0) k++;2 ~% R: ]) @. E0 g+ F
     if(k==q)
% W/ e3 B; ~7 j# D      { *(p+i)=0;" B) W# h; p8 R, G5 @1 r9 I/ U* r: c
        k=0;
/ a5 ~" f- [8 b2 R0 q) D        m++;
9 [: Z. l, y3 i5 w0 o; ^! `( w3 d9 M      }- b0 G0 o8 r7 ?) Q7 b* O
    i++;
- K( F- e9 K7 w) z    if(i==n)i=0;: s( q7 e8 G, D  |/ l
   }* W5 n- v) \* Y* N3 u4 B+ F( b) ]
  while(*p==0)p++;
4 X$ Z, e( i' Z% I. i4 o    printf("The last one is NO:%d\n",*p);
6 [4 r( \% P8 |* g) ^3 E1 o     getch();( N# \  G1 D* m' {

7 w! [/ v' l5 e  a! c% r6 \}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
: Z$ m/ A+ ?% g- G. M+ Cnamespace 又费马达又费电
: H1 ^2 G$ e' v2 f% m' {6 d' m{
( ]% l1 D' f7 a& [3 s+ z    class Program# _# i; i$ k9 }+ t7 W7 b4 i
    {
! A% u/ P; F/ h& `; d        static void Main(string[] args): d6 W( @$ g" o+ o. J7 u) U
        {
; |1 C# s) d6 W5 B' I1 w* p' s            int m, n;2 M& k; A& X0 T7 V( ?% w9 ?
            Console.WriteLine("请输入数组长度");$ F6 m7 C/ {- Y4 Q. C
            m = int.Parse(Console.ReadLine());//m为数组的大小
# W  \6 d% ~+ ~) G  Q            Console.WriteLine("请输入要截取数字的大小");* h' M$ z6 O4 Y$ S1 t' }
            n = int.Parse(Console.ReadLine());
% y8 ]+ ~! G6 s- m6 t            int [] numw=new int
" ]* m7 d, t) t# I* Z$ q6 n6 i
0 t' j1 |* u3 X8 o4 P&shy;&shy;&shy;;  b+ S0 Q  |7 k, Y( h
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数$ H; c" d2 b, V* Q; S% q0 Y
            {" u: Q) V: q3 \. o/ w! H
                numw[j - 1] = j;
' O( P1 n( G3 _# p            }
0 ^+ m2 W/ E( b! G' Y& R1 l            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!9 Z& q: Y' l- o8 z# G7 L
            while (d != m - 1)  D. B5 S, o3 r2 ^+ {" R
            {
/ A& D- \& O: p+ L" B- l2 b                if (i == m && d != m - 1)
8 J* h+ j) c& s9 V                {5 ^- W3 e0 }1 m: ]2 G/ j: P
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!) Y6 ~5 u- D5 `; `# ^1 v3 Y* u
                    continue;
8 o1 H; k( M: n3 J! I0 G6 C1 t( k                }
$ N3 }6 e# j" n  {                else
: A) {" M8 ~% L, p  O: C                {
& B) n1 r) \5 o! L                    if (numw[i] != 0)
) x9 x, f3 \- \8 E                    {
& t) _3 I9 I" y                        i++;/ P% ?8 S9 q% @$ B- b
                        k++;
) s( V! V% h7 Z" {                        if (k == n)1 Y4 C/ b, P+ |) U
                        {
* {8 K' L: j8 o% J                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
- s4 W* ?7 e: X1 @: @% g                            k = 0;
4 l9 G) Y" W* y- {+ Y              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1/ S8 ^) e1 n) O* X) D; O
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);! V9 Y: w, \0 j# C* Z$ a
                        }
" c* \- C$ U' X                        else//输出暂时还没有改变数组元素的值
7 I8 a% @% P) \: ~# \9 ]                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
0 ^+ V# M  u/ {                    }3 C# s4 K) ?( f& _& `! q4 e
                    else* G, m+ C. U' e) f( p4 v( J: [* e
                        i++;//数组元素为0,直接跳过,不计数。。。
# n3 z9 @+ c! H+ K                }8 [4 W6 j3 L4 P% k
; m. k0 Y+ [: y% _0 @  g  D  K9 D
' \. [0 M# U2 t% S2 N% }
            }//结束while循环
1 `* i2 k7 J! ~- M5 x+ O3 }            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦. W+ K& i( z/ N7 b
           
( @/ e9 {! }  Y1 x                if (numw[i] != 0)
! g( s( i* d4 u1 z                    Console.WriteLine(numw[i]);- E! h9 d) d; V% }/ g% P
           
: H: Y" H- B5 N& g" `            Console.ReadLine();0 a; O6 l9 j8 b' w1 v* p; B$ z: f  y
        }: B5 k5 s; _, j! g
    }
9 m# C  j9 e$ m" X# B}
% \+ I9 W! N1 S$ H7 K
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-28 07:02:23 | 显示全部楼层
循环队列。循环链表。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-28 07:02:46 | 显示全部楼层
这个题目就是经典的约瑟夫环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 11:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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