鱼C论坛

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

猴子问题

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

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

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

x
大家好!
1 j; O7 B/ B" a这几天我在忙着编一个问题,我用了一种方法编出来!
' s+ X$ p8 w. c+ k但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!4 s9 S% b+ V6 \8 R5 @  u  q$ \
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 : j) I& b* w0 }

$ X5 H3 I- C2 T# t
2 y8 X% \1 ^# t0 T( ~" J1 d
                            题目6 I- b; H9 h6 T9 s  }
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
. @; |- e: R% q/ o. T第一种方法:利用循环链表
0 W& D- V2 f+ C0 ?8 t0 z' a#include<stdio.h>6 T9 b1 r0 [7 q" U, q8 [  |+ q) Z
#include<malloc.h># W6 _5 v$ ]/ C% S  H) v
#define M 8            //共有8只猴子, B2 l3 v9 |0 e+ a
#define N 3            //数到3只时退出第三只
# Q4 x3 ]. |1 Ttypedef struct monkey; [* ]7 Y, ~3 l9 J% O
{int number;) l$ A& ^/ K+ K) d: B
int flag;6 K- S  H# ?0 m
struct monkey* next;
0 K% Z6 ?$ P+ T2 w. T* m5 Q' v7 u}MONKEY;4 f& E5 b* ~, E( d% m! V( X- _
main()
( C& l5 Q' W6 W{ MONKEY *head=NULL,*p,*s;1 i. b* k3 Z1 U, \6 F  Q# t# A" p
  int i,sum=0,count=0;
  d( ?6 \* A# G3 K  clrscr();              //清屏
/ ?0 O! Z: x% U" r1 u  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
3 q+ O2 u- X; W  p->number=1;p->flag=1;2 i9 \! L" p) m/ `7 d+ [. l8 H
  p->next=head;
+ x' N, y' G6 E; {4 |/ E6 G  head=p;! T  I% W7 I- @$ @. t/ b
  for(i=2;i<=M;i++)
3 ?! c; ~% e, p) x* E    { s=(MONKEY *)malloc(sizeof(MONKEY));
5 L. `8 g" l2 A$ X     s->number=i;s->flag=1;
6 `" w  Y6 b# o2 g: o     s->next=head;9 ]: T9 @% u$ c5 J; c
     p->next=s;p=p->next;
/ i+ j- k  Y0 f+ P    }! F; J5 w) J- r- \: V5 \$ k) o- e
    p=head;; z" D3 y# q; E" F
   for(;;)' z* [. l: N# T, M. l* a
    {if(p->flag==1); y0 R8 ]5 _/ q7 Q" A( z
       count++;
0 d+ Y1 `( z' @     if(count==N)
, N' w* l9 P( I9 T7 E        {p->flag=0;
! l5 G8 b" o8 v4 p         count=0;
3 {) m" Q( N: C8 k2 S% z5 ?- o         sum++;}
' z  w  O0 S: ~9 x: X) `' L     if(sum==M-1)
* ?* k* M8 Y+ V% j9 }# r        break;
6 ?3 p& j3 J) g7 S     p=p->next;
- w3 c9 B8 T! p; W    }/ c  D8 _8 _0 z3 F! x4 j
    p=, y( f) Y# i! A# l: e
    head;
5 j3 F* n4 V0 ]9 z8 Q: r/ v    for(i=1;i<=M;i++)
2 J. G8 W- D" v! B; T( ]& P3 b/ p, t$ V    { if(p->flag==1)+ X7 M! |- T7 s6 f1 D( N% [
        printf("\t%d",p->number);
: l- g4 ^4 z7 o% Y* W$ w; |      p=p->next;
9 Y) P6 {6 ]# }6 I$ ?, P    }
6 ?# J3 ~, ~& ]% i7 X  r1 ~0 _# a% m3 z4 C1 R3 n4 d
8 `6 q% v& v3 r# L3 L4 a! ^* F
4 r; W! k" k4 ]; S
}
/ G+ Y7 r8 g5 Q! J9 n- h5 A; h! |
第二种方法:数组
: f- ]7 h. W  a0 m# B' Y#include<stdio.h>" M/ z" p+ O9 [' b3 d5 I$ y
#define M 8
% v! |0 p" p, P0 H7 qstruct monkey
9 G  ~2 G" l1 v' f{int number;
# a) M  _+ R1 P2 `0 x- j& F" q5 \int nextp;8 @3 N- p8 j, g2 B' ?- @
}link[M+1];
  J: P4 i2 }* B! L9 w- D# J
9 b$ u! v- D: r7 ?6 l+ H0 Zvoid main()5 _- r( y3 G/ m2 S. n2 \7 e- t
{int i,count,h;
0 c0 ?$ t  k1 i' pfor(i=1;i<=M;i++)
4 t& @5 L+ C1 C( d- ~{  if(i==M)
; z8 Y( b- h  k   link[i].nextp=1;3 k2 ?% ?! W: E8 o: |- Q
   else
6 r; f& v. X4 A6 B4 ]& v   link[i].nextp=i+1;7 D$ \2 Q  o3 ~: o6 V
  link[i].number=i;
4 x4 y& s  a! L}/ A$ B9 R9 W( ]2 K
printf("\n");
- u( f& v+ S$ |count=0;
/ ^5 H5 K) l. `' u& th=M;
  {1 |+ }" |% ?" ]2 d/ {printf("依次退出的猴子: \n");
4 ~6 I. r/ [: y- M6 K0 @while(count<M-1)* F" d: T) r6 @) @- u1 s
{i=0;- w; L- M; M9 y! @! I! j! a
while(i!=3)
) p! o3 N. X, d7 I6 }9 `% S* Q/ P{ h=link[h].nextp;
  ~; ~! a7 P7 m   if(link[h].number)
; z# r% `3 `; K     i++;}, L- A( M+ O0 d: W$ y
& b9 p# l3 _5 }
printf("%4d",link[h].number);- ?  Y9 q) W3 r/ ?* G- n
link[h].number=0;& z7 \+ c& r5 q- n4 w* }
count++;7 p, D/ E  q5 k/ f
}. s# E8 a, U4 s! I3 c7 N; _
' [' |* n6 W9 ~: D  b' q
printf("\n大王是:");- d3 X3 L; [; k6 c9 Q
  for(i=1;i<=M;i++)
( Q, b7 E& r/ J( O  if(link[i].number)
/ s- b  E" i( a3 ?1 V5 [    printf("%3d\n",link[i].number);
, r" z4 ^6 i+ q& h7 |0 S1 \8 ~5 K/ e! n4 \' q+ m: O

) c( A4 D  k0 w; t}
  c) V! i5 @  s! \) w) O
第三种是普通方法for循环
$ I9 h2 Q3 Z" S* n+ Q, \- i& ^8 T
#include<stdio.h>1 f, q& A* H. ]. r) g
void main()( G8 e3 O. E8 n9 B
{ int i,k,m,n,num[50],q,*p;9 ?3 Q. T+ V! o2 s8 W3 ~% M
    clrscr();
/ n, Z/ l8 x7 K; Q   printf("input number of person: n=");
! Y; q4 t, V+ D$ W: M    scanf("%d",&n);( W( ?/ I' u  y5 q( V. e" J
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
0 y& f! d3 b+ d( A    scanf("%d",&q);! r. i+ M9 V3 I5 ^* ~
   p=num;1 b7 t( U: L2 e; W0 f1 e
  for(i=0;i<n;i++)% L$ V5 q, c, s( C) d3 [
    *(p+i)=i+1;4 r) h! ~, n9 b
   i=0;, n0 o% h" _  O6 S! A+ t
   k=0;
" F1 N( F9 j# N  a3 W   m=0;
" _) q7 T# h0 @! B( V) \3 ~% [  while(m<n-1)' ]: j9 q' s) g# f; J
   {if(*(p+i)!=0) k++;& F+ E& o5 [1 I% j: ^0 l9 ~5 J0 u
     if(k==q)
( ~4 b* Y/ _2 M# m( g1 r  f$ V9 l      { *(p+i)=0;
, ~# V; U8 h% u8 u  v8 C        k=0;
. j# I8 b/ S4 G        m++;
- P. H9 s3 y0 [! R6 o6 i% |      }
. L* r1 J: I; [% y1 K6 k9 \    i++;) i7 Q. j$ q5 Y1 Y" T
    if(i==n)i=0;
; W: Y/ h$ d0 X/ h# {* h7 [   }
9 B/ |# K5 x( G0 ~+ j  while(*p==0)p++;$ K( ~, C4 _9 E5 I: n0 u4 {, D
    printf("The last one is NO:%d\n",*p);
& p4 r( p0 g6 a* e1 S     getch();
2 v# T0 u. i4 i% \0 ~% M8 j$ c# ]% Q# Y% _5 F/ |1 S
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;$ W6 {- b' E& b  |5 {  L
namespace 又费马达又费电
  r( s, v  O" t! ?{8 u7 b! I' F% k7 }' |  \6 o  C
    class Program
  U$ @% Q# v& U. T9 Z! g    {
, }5 [/ B. L4 G( @9 @; P( q4 T        static void Main(string[] args)5 v) M$ `# K/ K9 H: B- V
        {
" A( p: t; O* K4 P            int m, n;
5 E9 Y4 w3 q, |" d            Console.WriteLine("请输入数组长度");
4 n; g& ?& ~% V5 Y3 c1 {! S; s            m = int.Parse(Console.ReadLine());//m为数组的大小
1 `' v/ o" B6 B+ j1 F3 m            Console.WriteLine("请输入要截取数字的大小");
( {/ N  g& d. \* I0 T            n = int.Parse(Console.ReadLine());
5 l) X9 q( e/ _' i" A- p; X/ j            int [] numw=new int
! K# q0 A+ D% B) l0 s+ v' l" Y* }" v" h- j
&shy;&shy;&shy;;( \" L# k6 Q' b# N
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
0 f9 q6 C, Y  W. k; f" ?# `9 @            {5 I* `$ f( [9 j* K  f) H% r* c
                numw[j - 1] = j;
. d+ L9 t& G1 Y6 Y- F            }
+ w6 S6 Z% Q! N5 S            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!3 A. R% u% _6 _7 K; U/ a5 g
            while (d != m - 1)$ y  B. o+ F8 y
            {% e$ H6 r3 F- y+ v. K4 }6 b, B4 d
                if (i == m && d != m - 1)
. }9 S+ d# s9 ?6 Q# ]                {/ {9 x- m( \6 R
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
/ g+ j) b+ j, x2 {4 G' a1 ?9 U                    continue;) q# Y/ \8 `; P3 j& r
                }
4 H0 a  N! R9 t                else7 t8 E2 Z. t& T4 W
                {/ x( f: s/ `/ m* m. A( u& Z
                    if (numw[i] != 0)
. A' B8 w+ [6 [                    {
3 @3 O- m9 B9 d& q. I/ \; X; K' X                        i++;& h3 r4 W$ ^2 y( }6 q$ h" Y
                        k++;, W0 P1 R- y( |
                        if (k == n); k) l/ H. I, T. S0 t
                        {
0 Z4 p" U  O  Z1 Y# x7 J                            numw[i - 1] = 0;//把在n位置数组元素的值改变了/ ?& i- c- y, L: n, p' E+ v- t8 ]
                            k = 0;
6 p6 O* r. P+ T& M% [+ C" C8 [" p& K$ R              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1+ C* l8 X/ @; G- I  O. e
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
7 b8 l  x( C3 J- D% H: A                        }
: E- |* J3 j& {! N# {                        else//输出暂时还没有改变数组元素的值& Q/ T0 n, S- ^6 J$ E& E
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
" g6 J2 ^6 R! U( G! ^7 c* ]1 G                    }# M4 N0 `' r7 R' A
                    else
& V# g8 o0 k' R( f* [  k% m                        i++;//数组元素为0,直接跳过,不计数。。。
1 Y- u! @4 E1 a8 `( N: [                }% D# y9 W% h7 a: ]2 ?
& q" S7 W0 w$ W* b8 w6 J/ m

+ v' H6 N. I" h- L2 ~- B            }//结束while循环
6 f, X* L9 ^2 P# y1 v. u' j6 P0 V            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
: L6 P1 X3 \: s3 f( w: p7 h           - ~6 @- M+ X+ k
                if (numw[i] != 0)
- P  c* l! l4 h% [# F1 o                    Console.WriteLine(numw[i]);
/ e- W3 T6 f# n& @+ f4 o           
: _+ W5 i2 l* C5 W            Console.ReadLine();8 G" I0 T1 q* p# S: G# y+ {
        }5 B7 A$ U* |; P8 C9 X2 K
    }
# u- Z1 s9 F; t3 M' ^}
' b7 {% u$ x) B
小甲鱼最新课程 -> 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-1-25 14:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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