鱼C论坛

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

猴子问题

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

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

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

x
大家好!
3 ?/ y: U& G2 n5 ?% d" P$ D这几天我在忙着编一个问题,我用了一种方法编出来!# p8 r* P+ E7 P3 P7 C- \9 t( w
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
+ P* {) A' W) b+ w+ a' b* C" ?, i) V) g( }注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 # i: F; \5 k' `# T
- [5 p8 I: B/ A& i; y0 c

# ?9 D& F3 i# d4 G
                            题目3 y+ c( B* Y$ D7 K- o8 {4 G4 P
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
* f# n1 m4 i4 U  ?. u$ U0 V; q第一种方法:利用循环链表
, e: F7 O6 g0 d" r#include<stdio.h>
* D# g( W0 B% W# h# D# m8 Y#include<malloc.h>; [( }: |: k+ L% k' x
#define M 8            //共有8只猴子/ p* B# M9 X' o, c$ h
#define N 3            //数到3只时退出第三只
" f# s9 n7 C- e. @- C/ Utypedef struct monkey
. g8 ^& |+ g6 Q9 @4 F; E  G! ]{int number;) X( g$ k; [$ W4 P
int flag;& G0 O' p* l% B  y% e0 E
struct monkey* next;
7 b1 M# D3 C& A/ `2 \, R4 }}MONKEY;9 n/ ~9 g2 m) e+ d, F& Z
main()
& q$ I8 q- X! F' t0 {; c{ MONKEY *head=NULL,*p,*s;. p& Y, P9 l7 L. A2 t1 Y
  int i,sum=0,count=0;
0 P" s9 S& d  y; M6 B  clrscr();              //清屏" t4 ~# V4 V/ P
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
+ M) |9 r  o# u5 |  p->number=1;p->flag=1;
/ _7 Y/ P: W3 \0 I) w2 B  p->next=head;
+ k6 W+ ~5 T4 L  head=p;# i) J* q: X/ Y& o* Q
  for(i=2;i<=M;i++)/ c3 [1 x) x& i+ p) {
    { s=(MONKEY *)malloc(sizeof(MONKEY));& r/ I- N. K6 ^
     s->number=i;s->flag=1;
4 G5 ~4 H  G3 S: @0 @     s->next=head;
! g6 n5 i3 S" z1 }     p->next=s;p=p->next;
' ~5 Z5 d* z0 c7 x) \7 t+ O    }
& K) y6 W$ J8 b9 o    p=head;! n" q& t7 N  R$ _6 ~( K4 C4 k
   for(;;)
$ r8 w: w2 ]/ N% y    {if(p->flag==1); n, O& J) W" R
       count++;2 x7 S# ]7 u, v2 K0 ]5 R0 n
     if(count==N)
$ l" l3 u6 H3 q* |! |        {p->flag=0;
9 J9 ^7 U. X. q2 v1 n8 F         count=0;
" ]$ h. j$ P- l' |2 ?         sum++;}
/ c' q/ z% [0 s7 m, k0 A) D9 q% z     if(sum==M-1)
: K* `2 r/ c+ ~# D0 ?        break;* H% V9 q( f& r1 }
     p=p->next;
5 `: C5 ~" i+ a- A7 ?7 t1 r    }
/ d: ~3 k6 f! r& l. p, w/ `    p=
# X9 d2 l  W- `; U. R& ?7 @4 M    head;
6 O- y; @( C: a* G8 j% S    for(i=1;i<=M;i++)
# B8 m. u- s+ x3 J3 }( [    { if(p->flag==1)
, y7 h# @& \  k- Y3 }' K: x/ v        printf("\t%d",p->number);
+ ]8 u/ [( M0 p; m9 f      p=p->next;
5 h4 ~5 H6 o- z# z  I    }# n! \* }3 J) C- v

3 F; i8 S% O/ D1 k+ o% P: _# M+ E
1 a+ e- N2 }5 |/ Y9 ^1 m8 ~3 y
$ g, a) _- i; Y5 l, b}

" g/ H, ?% S) R- e5 n! O: M- g9 l第二种方法:数组9 U( O, b0 |+ i) _
#include<stdio.h>9 I& p# r, E" z' s
#define M 8  e0 C. @! B  R. p3 J; e
struct monkey7 @- D7 B  [4 @7 }% b
{int number;
8 |7 u( C9 c5 ^) M# Mint nextp;
% K+ R) ^9 W, \- T7 a2 {}link[M+1];; k8 n+ p4 R/ s0 z: t' a8 S6 P
0 t; ?) s% j4 s
void main()
% C8 j; Y5 T( c+ q{int i,count,h;+ z: A) a- [% C2 v' C
for(i=1;i<=M;i++)) m' S! A* N( [6 T" F, `" u  J
{  if(i==M)
' T) m$ n* u1 d) X+ {1 L! P; X   link[i].nextp=1;
: P! v5 H" ~) s% Y" V) p1 G0 i* M* E& N* S   else
/ m& g) s7 p6 ^- X1 y, r   link[i].nextp=i+1;
2 Y$ m) G$ @. T3 g, G  link[i].number=i;
2 p, g! |3 Q( V; W7 m/ D! }' v+ c}; R2 ?* i7 l, x9 b3 f
printf("\n");
( ]% Z' J* h/ q& w5 z( Icount=0;
6 b; N3 ~3 A8 Q+ N; D5 sh=M;( q& I+ Z- i: S, s0 c! K, W
printf("依次退出的猴子: \n");  y4 z; L; A( N4 \
while(count<M-1)
* _! N6 V% \' K- I0 E{i=0;
; h% ?( F; E$ l. O0 gwhile(i!=3)
  Y4 [+ R/ _7 F9 F{ h=link[h].nextp;
% M- _+ t, [) @  @  O# X' l) m   if(link[h].number)1 b5 o% t' f9 P0 ^3 _# j) m2 ~& a
     i++;}
$ I* L! i1 ^6 r* r. y" `7 u9 h& N. f7 i8 l
printf("%4d",link[h].number);
, _, z" H6 J- u5 ?link[h].number=0;
8 n5 p/ N0 @2 ]8 Y0 s, Jcount++;
& n6 `  \9 l# ?8 J; Q+ ?. e}! c2 s+ \3 d/ \- n; F
4 z8 y" _# Y( `1 i; J1 m# l+ X% ?
printf("\n大王是:");
; p2 Z6 j( X0 j( {0 W  for(i=1;i<=M;i++)/ `2 V+ |( z; t" J8 }% u0 {
  if(link[i].number)' m, f" g$ U, Y4 C7 u- W
    printf("%3d\n",link[i].number);
0 F) {- P1 U. `0 M% _$ ]! n9 n/ L( P# x6 o; C, w9 w6 L0 ~

) f6 D9 L7 r+ F7 o0 U}

: L2 c9 O4 w! F6 {+ e& f第三种是普通方法for循环

1 e5 T4 Q! v& t; ]# _+ h#include<stdio.h>
4 t! a7 P8 ?$ |1 uvoid main()
( h1 [& l3 J( z3 t{ int i,k,m,n,num[50],q,*p;& b, `, \& q" m2 S
    clrscr();' _0 g) c) `+ @  E- P3 q# f  u
   printf("input number of person: n=");; l! m" q8 r' Y* |0 W
    scanf("%d",&n);; Q1 o, D( c2 ~. v" o
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
1 w8 \; W8 `/ X% Y5 S- x2 E) V    scanf("%d",&q);7 C! g5 `( G3 p5 t; J- z- x/ L' i
   p=num;, h" g; `. \+ H
  for(i=0;i<n;i++): c+ W/ r( x" D, n
    *(p+i)=i+1;7 I! ^; o& `) Q' M* K6 @, b7 J8 q
   i=0;( A; ?& w! U3 K9 o- L
   k=0;
  I$ f: x8 R4 n% @   m=0;9 u. p9 Z# l2 k+ A
  while(m<n-1)
8 P0 p+ n$ B6 s6 W5 F- I) _   {if(*(p+i)!=0) k++;$ K; B/ Z$ q5 |# z
     if(k==q)
) |7 h+ y. U1 r: A& E" @* n& a      { *(p+i)=0;. @3 T. v# I! N0 y
        k=0;$ a* M0 C/ U" t7 e
        m++;& v% O% y: o& K/ \
      }  z. X1 g0 d$ o" k5 m) \
    i++;2 D! {, g  M  u9 n. D" \& _
    if(i==n)i=0;
* @/ Z) L; d% d: d9 _6 |5 D   }7 h/ @. L0 q* U  R% r
  while(*p==0)p++;2 o& U' a4 i; N/ K5 H8 E
    printf("The last one is NO:%d\n",*p);2 T# C1 e4 I, E( i- m  ]1 k; Y4 J
     getch();, M0 O% m: Z5 U$ P5 v

/ l& N) M/ p" R* _" @}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
1 k" w9 J' L0 W. F, m4 Bnamespace 又费马达又费电
5 e( g3 X; P7 r8 U& k+ _{4 T* J9 P, c$ d* q2 E9 B( T3 d/ K
    class Program5 b4 t. c* E( w& G5 B; E3 G
    {
7 |' ]7 T: ?" Y7 ^& ^        static void Main(string[] args)$ G0 t4 s! N1 Q. V9 Y
        {
3 r% ?  p1 T4 t- i% g3 w) H            int m, n;
2 t: K. y# T; x, x6 Q            Console.WriteLine("请输入数组长度");& _$ `  t% Z) q/ m
            m = int.Parse(Console.ReadLine());//m为数组的大小6 s. S  x6 j5 q6 b3 p% D& w
            Console.WriteLine("请输入要截取数字的大小");! P) l; z+ a( ~3 h6 f$ x5 i" C! V
            n = int.Parse(Console.ReadLine());7 w' X9 d5 t, B
            int [] numw=new int2 R! a4 m8 [1 B8 R( ]3 O: x2 n
/ K0 Z( G( n9 Q' ]
&shy;&shy;&shy;;- D, [0 {" \- u; ~( B( t
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数6 x" Q9 @* `) s: @/ b% |
            {4 j) B* i) k3 [8 e/ ^+ A
                numw[j - 1] = j;
8 \6 b2 r" i' ]( m' d5 ?* d. j+ V            }
8 X. i# O- D9 ~# e5 [            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
  ~) e  P# K( i9 B0 n, j            while (d != m - 1)$ I% N6 [- }+ ^# I. v5 l
            {! N8 ]3 h; a* W
                if (i == m && d != m - 1)" `/ \; }1 N+ |8 s' h( ~2 Y
                {* i. x0 r! v) B
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
( w" A7 C- b7 I5 W8 v' @8 H                    continue;
$ O: j! w6 b: x, t$ }* P- n                }) Y, B: ~7 Y& v$ X4 L' `
                else8 p% {$ c. J2 ^& d- M3 a: U/ w
                {5 I! l$ J( ]1 \; y, ?' M
                    if (numw[i] != 0)
4 i' a( \) G0 n6 q7 Y+ N2 y                    {
9 l3 C7 l1 s3 R3 K% i                        i++;' i4 Q; s3 t2 x" `0 O- W
                        k++;% l1 z& H8 ]& L$ u9 F5 W
                        if (k == n)
9 K5 T+ S4 u; k, D0 n                        {/ C# r- G# n! Q7 L8 J
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了% i7 g2 g; n" x* {1 {
                            k = 0;, h0 @$ P9 j+ g; k3 D' n. l3 T
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1( c" N, R8 q2 i: E# U0 M
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);) J. D) v/ X' R; r- U4 ~* a! c
                        }
" s4 g' O4 m1 o0 b! a. {+ w                        else//输出暂时还没有改变数组元素的值7 m9 x6 }$ L( h. E; J' n- V
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
, b/ y$ t" A/ F: @3 H  U' _                    }
+ F7 `6 t  @2 j' v  R                    else; n6 t. @0 P5 i3 a( ]
                        i++;//数组元素为0,直接跳过,不计数。。。
1 e4 B! M% }5 n% i, s% ]) S6 J                }2 X3 A4 _' b3 l# V* Z
3 z$ s8 U6 e/ z# Y

2 W# P. L- w+ l0 n            }//结束while循环
9 H0 v  L" f! L$ h& b            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
: w+ W3 H  ]4 C1 U, z6 M9 b           * Z. f6 J& u: u( C2 h
                if (numw[i] != 0), T6 s4 U2 \( |, U+ `/ ]( |
                    Console.WriteLine(numw[i]);
  s9 b+ L# f: X$ l           $ ?& _, {  x7 N8 F( d4 G
            Console.ReadLine();
8 @# ?$ d) t2 X! o5 C0 s        }% O, T' |/ Z" b: S9 P
    }, B) _2 ]: k' U$ h7 z# s9 b( }
}9 `1 q6 |! f6 ^# R& D+ X
小甲鱼最新课程 -> 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-29 04:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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