鱼C论坛

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

猴子问题

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

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

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

x
大家好!# Z; K+ w8 F8 w: S) `  c/ [8 {3 a
这几天我在忙着编一个问题,我用了一种方法编出来!" Z2 n3 `4 [0 n, `& \9 q
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!5 u8 S% n5 @, z. q6 j1 k5 n7 }
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ; X/ S4 y6 s% \. n: i* F  y, t

( W- P  s" a* n4 z
: D2 s! E$ S9 s8 `9 Q; |. u
                            题目7 g* P+ d: v# _* l4 `' l- T4 H
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
) e/ ?1 ?2 x0 _" m% W4 o& x第一种方法:利用循环链表
2 j: t$ P0 u" _#include<stdio.h>
# p( Q8 H/ M0 [, s, s#include<malloc.h>. v5 ^% ~$ \' P' V
#define M 8            //共有8只猴子) a' n* Y, }3 C0 H
#define N 3            //数到3只时退出第三只% X9 l9 O& [1 w" L+ u3 S" ]
typedef struct monkey" i0 l0 _6 N& X& e
{int number;
' y/ m. ]6 @& {$ V4 ^- a9 ~: Aint flag;) T7 t* o, r# T, J3 L
struct monkey* next;' a+ l2 u  i0 x& _) E* S
}MONKEY;
5 Z2 w  b4 s7 f* ~( s7 J$ Zmain()6 Q: [1 j- [: u& V
{ MONKEY *head=NULL,*p,*s;: _% |. T6 c) t3 o. {: M+ b9 S
  int i,sum=0,count=0;
6 a' o7 f2 t8 a  clrscr();              //清屏' C  l2 r( u$ N2 ~0 L3 A
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
" v$ T* L9 ?( e7 y, Y  p->number=1;p->flag=1;
* {- X5 [! S* T4 O/ G4 f  p->next=head;5 y) b) `5 `! K" L: k& h
  head=p;  h; G8 `4 v# ?( `
  for(i=2;i<=M;i++)
' \6 |8 o" {7 Q0 F0 l4 s2 B    { s=(MONKEY *)malloc(sizeof(MONKEY));
5 N' j( P5 l; K4 t9 C' ~) g5 I     s->number=i;s->flag=1;6 F) i. A5 W6 z8 U/ w
     s->next=head;2 Y& f3 R  D/ P4 _2 [! x
     p->next=s;p=p->next;, b2 Q$ T# s: g9 Q& R4 R8 B
    }) k0 C* }8 m5 w
    p=head;
: x, D/ |5 @- k" o0 P   for(;;)& A! ^) B1 _% w6 W% E% D/ d
    {if(p->flag==1)6 D5 J5 K  p8 }
       count++;8 E! b& S+ U* i
     if(count==N)
6 ?2 }: b8 L0 R! E( I$ g        {p->flag=0;/ P; `* G, f. p& b: X2 {2 B: q
         count=0;' ]3 a2 i' Q$ a0 w' ]
         sum++;}. F; m" v% x9 _/ U* A1 T  J" C
     if(sum==M-1)
1 n& K% F  I* Z+ p$ l8 w: A        break;, Z, l% g4 Y" I
     p=p->next;/ X+ K( k' s  g# q2 F2 _5 l9 {
    }' T$ Q& z9 m' u# C
    p=
0 i& ~" x% P2 `3 I: g% \2 J    head;
6 b; }% K9 Z2 z2 u6 Y+ _    for(i=1;i<=M;i++)# }: J) I% R7 f, X# C; l" o- V
    { if(p->flag==1)
/ T" p, Q; v# [1 P7 {/ @+ K9 h9 O3 _( }        printf("\t%d",p->number);7 }7 H2 o+ ^; s# ]. m
      p=p->next;: @- |1 |! D- D+ X
    }
0 a: Z/ u$ k- J( C- e, h  G, I0 J# {$ i
. O: h3 h" B" ~; j. `
; z3 W9 U  H3 Z
}

& s8 b& A4 r4 Y第二种方法:数组
7 [+ H9 p/ D1 U2 i' R, y#include<stdio.h>
$ i7 {. O" ?# y$ C, Q' f- c. W#define M 8+ s4 r5 ]$ m3 }& d: _7 J5 }
struct monkey
+ x1 C0 u, e1 l0 H: u{int number;
/ J6 q: I( \' {& M4 v; D1 O3 hint nextp;, H# H1 j+ H  D% C( u! U
}link[M+1];
/ S; Q8 ~# x- N+ k2 O' n* t! b( H6 T/ {: A
void main()! R' p. |: O3 _) a$ z
{int i,count,h;# v3 e- T) l; a8 K6 U! d
for(i=1;i<=M;i++)
1 x9 x/ T$ z" j6 x7 }# {0 K. v8 @{  if(i==M)
/ v4 u, V4 T+ `7 h7 k   link[i].nextp=1;
1 e$ v# A: p3 B8 E6 I7 m! J   else
2 B3 }- ?" V  ?7 ~, p2 Y1 Q1 I# x   link[i].nextp=i+1;
  I' Z1 }, @# v, |' M5 F  link[i].number=i;% c6 R2 s( ^* {2 |8 c0 k" [
}
# i& y. U, U7 l' d* [5 Aprintf("\n");* G: w( o3 c: A3 z* v8 ?0 S
count=0;( F* @. v, [1 `' |5 f7 b
h=M;) W( Y5 R& T) R+ }
printf("依次退出的猴子: \n");+ S' T1 g/ p9 U0 M' l
while(count<M-1)1 A2 p$ I0 M. G* @. P
{i=0;/ N# f* T. D+ Z( v. g3 D7 ^- l
while(i!=3)
" w, j9 }' |5 o7 i3 C, n{ h=link[h].nextp;
. [: U, E, G* W+ N2 h7 t( S   if(link[h].number)
  u' p( H" i: j% Q     i++;}
! M  O' _% N5 U; g* ]
5 B' t* E; x" D, z' ]& iprintf("%4d",link[h].number);/ q& x1 A5 x9 n- _# R
link[h].number=0;
7 f% `4 B- s5 i: ?8 p0 lcount++;4 P5 E' z& K4 A; W( {
}! I0 S! L3 A  ~0 f  @( e8 f

  m  t$ t! C* \* \' G2 i: q$ Jprintf("\n大王是:");5 _* [9 i' Z; H- ?
  for(i=1;i<=M;i++)2 d) C/ }! W4 j' x: _) f
  if(link[i].number)9 h( P9 O, i* F5 Z: }
    printf("%3d\n",link[i].number);
3 M& o, m* U$ k( [' }7 g* U! e+ a: P4 `! m. Z
+ u' ~! W8 o' o
}
' ?8 t& U, O5 k7 t. b6 n
第三种是普通方法for循环

& n4 x: @$ b+ V) a#include<stdio.h>& t. U# ^+ q4 W& P5 |! j
void main()
8 c1 U. ?$ w2 \  q{ int i,k,m,n,num[50],q,*p;8 @+ N4 N6 g& O9 J( H- p
    clrscr();
' T; P8 X, Z7 N+ ?   printf("input number of person: n=");$ I& p3 i7 A0 r4 y+ b1 t/ x
    scanf("%d",&n);
7 i- u5 k) e6 {0 K& Nprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
7 O* a9 O3 r+ D( ~5 G. V5 O  Y    scanf("%d",&q);; O& d- d7 _0 Z" q1 f
   p=num;
) u* C4 e6 c4 u  for(i=0;i<n;i++), N' J/ U* ]% c" s  |
    *(p+i)=i+1;$ j- S  U) m7 G; p6 q8 x* \, e' m
   i=0;' y2 Q5 F/ r2 e4 g
   k=0;
4 k9 d: ?6 ~% Q) Q, V   m=0;
& u& u0 D) A- o8 q( q: L2 m  while(m<n-1)0 L7 I0 W$ T2 R  ~0 |2 S) j) h( _" G
   {if(*(p+i)!=0) k++;9 S2 x* z1 X4 C7 @. S% m
     if(k==q)
* p2 B" T, N# n; X3 f" `      { *(p+i)=0;8 [( g1 ~, j( b, O+ J: J
        k=0;  E1 x9 r0 g( y% g; h
        m++;
8 X# {& A, x) B* o# L1 c2 X      }
8 V8 O+ @( V2 f& l1 D" ]  ~. C    i++;4 _3 I6 G6 C5 F
    if(i==n)i=0;
% q; x/ t- F% _" Q& s   }- r) E3 g9 H: s' {  ^$ }, M% g% Y
  while(*p==0)p++;8 z5 {. [, \1 p
    printf("The last one is NO:%d\n",*p);( e! Y/ I/ A3 {$ K  x2 Q
     getch();; n3 x. M9 I0 M  w

: ]* l( v. k8 W3 h}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;% i; s% J5 o2 N; W6 W$ b% V" P
namespace 又费马达又费电
7 K8 r1 J  {1 n* E{: M' y& Z$ D- [( |1 K
    class Program) k9 B3 C4 K! E
    {
' J& v. r8 p4 y* J! j) i        static void Main(string[] args)8 F) ~/ z6 k& J! v: q- p, O$ J
        {
" }3 d7 G  r1 `            int m, n;
0 F: n  Z; I4 q! p7 M6 d4 [& K; N            Console.WriteLine("请输入数组长度");0 E8 V/ g2 h6 n; l2 q
            m = int.Parse(Console.ReadLine());//m为数组的大小
: v& D! I# z8 u1 @* Q            Console.WriteLine("请输入要截取数字的大小");4 d! Q0 b6 U" B+ h, e
            n = int.Parse(Console.ReadLine());
8 V5 o4 ?9 x3 u/ j: B0 y. a1 d1 [            int [] numw=new int
+ ~4 g) O# X0 |: B% X' i) N) y. {
&shy;&shy;&shy;;* P" f& Z+ L, m" \4 n* j! D
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
/ p/ B& N# D2 ~4 M            {$ Z* B* J) |' B
                numw[j - 1] = j;/ U, M: g/ H( @. v1 L
            }
- m6 V; u" M! v3 T            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!) M% _8 ], I- b! j6 U0 @. a8 w
            while (d != m - 1)
- g) n2 P0 A2 e8 ^  @" D            {! \, ]( r6 l' l1 X+ |
                if (i == m && d != m - 1)
! x6 u2 R1 w! U3 q                {
+ y* Q* @' F/ `3 G% h                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!& l- o" r* ^5 _0 X
                    continue;& X; G" v4 ~. g, w; q
                }! [# ~. I, ?7 A& B  d# `  _* K
                else8 r9 i1 ?* `, l8 p, z
                {0 D4 z) w' D( _+ B
                    if (numw[i] != 0)  A  x& s9 R7 W# p* ]
                    {( y, Y& C% P. }2 M
                        i++;7 C! Y+ K* H$ l: N& l  M; V8 o; {6 A
                        k++;5 X. H( M7 ^8 W
                        if (k == n)6 q5 F7 c1 t  A8 S5 l" l8 t6 P. n- S
                        {
; D; r/ O4 @, a! E9 u! ?5 A: l4 e9 Z                            numw[i - 1] = 0;//把在n位置数组元素的值改变了) c  Y8 ~( k  x0 x6 r
                            k = 0;' [/ K( h" V+ R% w6 |5 E/ T6 L
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
# Y$ |% \6 U/ K4 F                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
0 K+ n( E7 Q- e$ r# J. }8 i                        }* h* E( T8 L  N. [( M+ B1 m
                        else//输出暂时还没有改变数组元素的值
8 y0 n, S5 x1 E  ]6 v8 Q/ E                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);6 Q2 x; [' b% d1 C, z% a& N4 `
                    }
+ L; F4 N6 S# m+ z7 T                    else
6 t9 @& ^& _# ]- U                        i++;//数组元素为0,直接跳过,不计数。。。" V+ t0 V/ J" v/ u, q$ g' p
                }
4 [+ H% x( _- ~' |4 l8 B. B8 t) k
& J0 r, C0 @3 f# g3 v0 S- {9 Y/ C, d% a. [1 o, J, S2 v# I; M
            }//结束while循环# P3 b; Y  H% B! r' @
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦+ q: a: c' F4 z1 o
           
; H# c: }1 r  F! e; {0 T                if (numw[i] != 0); E1 B- [8 {8 z$ F. J
                    Console.WriteLine(numw[i]);
6 k. m. {# T, ^1 H4 q7 V           * Q7 E' @* D7 b) N5 G
            Console.ReadLine();
8 z) x! J6 H# f- m. E+ A5 @( Z        }
1 N4 q' D' a6 J    }) q  E/ `" X) z  F( M. ?
}
7 j) X/ D/ `2 I* E% Z9 \
小甲鱼最新课程 -> 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-7-13 05:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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