鱼C论坛

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

猴子问题

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

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

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

x
大家好!) F  E, }" C7 E1 _  F
这几天我在忙着编一个问题,我用了一种方法编出来!
" ^4 q9 ?8 [' g' s7 U' [但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
$ a' _" p# l0 t, Q注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
6 @! g8 s3 O; S% N, C5 w/ Y8 L( g/ W1 [# l, _' B! l- r2 j
6 m4 J* P- I) F9 N" \. x# }% B$ M; f
                            题目& c3 @' L9 F" G' h
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。( D  {5 v6 V4 R, F1 Z+ h& ]
第一种方法:利用循环链表
( K5 ]3 V. v4 J+ G7 v, V#include<stdio.h>. N+ n& `3 a' X# h  F
#include<malloc.h>8 J9 D8 h9 p' m  |* \+ a# y
#define M 8            //共有8只猴子
6 ~' H: l6 ?0 K3 h% V3 v1 r2 x9 f#define N 3            //数到3只时退出第三只4 B' W1 i' l! X- \; g. Z3 O
typedef struct monkey
7 D% M. l" }% z. D{int number;5 @$ [4 p' |7 Q& Z3 Z
int flag;+ e( h' b4 S! H: _+ \0 k
struct monkey* next;( R8 U2 s" `! n5 u
}MONKEY;8 M1 i4 B6 L: j+ q% T
main()% y% _. X+ ?& C! Y& s# R
{ MONKEY *head=NULL,*p,*s;  X) v% z+ H) o$ C  r, n' k
  int i,sum=0,count=0;7 F1 d) O: V0 t" W
  clrscr();              //清屏4 w; A! n! z. L% |9 z  P
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存- e2 Z8 k9 q6 f" i. X
  p->number=1;p->flag=1;* Z* Q. }4 N" u; j
  p->next=head;
9 O0 J$ |# u) l6 A" s* M  head=p;9 C# b1 c8 d) h2 G4 t  t  M
  for(i=2;i<=M;i++)* A" k2 G1 z( g: ?$ G7 M: s3 U/ ^
    { s=(MONKEY *)malloc(sizeof(MONKEY));. \5 u9 s, ~* A0 L  w& L" R. x
     s->number=i;s->flag=1;; g. V% @" {7 ]' \
     s->next=head;, S' a0 N  a- I) q, s- h+ n
     p->next=s;p=p->next;
+ g; Y+ M' R% s    }* y% y. P: H5 u9 x  R' t& W( E
    p=head;
+ ]# C% L. Y6 x; {$ u% S9 {6 B   for(;;)
5 E9 q, e( u5 T$ M# b& a* z    {if(p->flag==1). q8 [: v& l( n. i% u
       count++;; [! J* y$ F0 Z  v# u; M
     if(count==N)' ]& d4 M& D  ^9 B! @1 G- d5 A# ~. E
        {p->flag=0;3 q: m4 c. h4 E5 L" {
         count=0;) Y% N7 k3 K- ~  l9 g) J
         sum++;}
: Y# I6 j4 `- `3 v  ^' K! z     if(sum==M-1)
" B' P9 O. M; D% ^: f+ _9 |9 U+ M        break;
! T% f- u6 g: ?3 i9 @     p=p->next;, Y1 h5 {$ l$ z( v. R
    }) ~# f: h6 w/ p$ Z& z, h9 M- Z7 p
    p=* g! _# _6 T9 k$ \$ {% e2 d
    head;2 x* U) d3 h) ~9 P% }8 C
    for(i=1;i<=M;i++)
  u- ]* ~" A) X! j; q    { if(p->flag==1)
; n) |' V# A5 G* _* Z% J+ f0 Z        printf("\t%d",p->number);
, m; ?, b8 j2 o! y      p=p->next;
, {9 G0 Y4 z8 ~' c; N    }
9 L3 ]2 V* C3 u7 H" b, O
' ]$ l) e6 J4 ?4 H; V* V- N& D# o: _% y9 {4 f: E/ h0 k) d0 G
, B- D) G; z$ P# B( g4 ~9 H
}

! b9 C) u: p# w- s# C4 X* L0 P( _第二种方法:数组
8 l' Q8 h1 c9 J" \( e#include<stdio.h>. t$ Y3 Z3 u% C
#define M 8
9 ]7 a0 p- l- c& Nstruct monkey) }; V( M  g0 J4 x
{int number;
9 V) N3 P% {; ]int nextp;
2 f. w" w% P' g( P, J: x# X}link[M+1];
" {! p" A& o" i: T, J' @/ m* z
void main()
) o  {3 w- Z8 {! E) G* M8 c{int i,count,h;
1 m$ `& e1 k1 t, L2 Yfor(i=1;i<=M;i++)+ M$ q+ x/ v) ]& [, G. h9 R
{  if(i==M)+ N' k+ r' `0 a# o& c! D( N3 X
   link[i].nextp=1;
6 E9 o! U; q, {& f" x0 ], }+ {, o   else
1 g( u+ C' L' l- t" W# s   link[i].nextp=i+1;
" F6 ]; G- H% |) x* {  link[i].number=i;
, v( p" M& i& A' R& r+ N, L- _}
6 A1 k+ i- N; Y) J3 h; \7 |printf("\n");- R! z8 o6 |4 t5 _' W, r: ?
count=0;4 u& L) n2 f# c8 K# `4 I% l6 L
h=M;
4 A  L- f% n3 R/ }; c" g" b; M8 Cprintf("依次退出的猴子: \n");
4 J& L3 i; P. i0 C. @while(count<M-1)
( n7 m/ @+ `) X7 a( `# x{i=0;! j- j, R& J. F7 n1 J
while(i!=3)
3 h7 O  x6 V1 T3 D: X) O+ O{ h=link[h].nextp;
( i4 @% S7 K  @   if(link[h].number)
5 n3 C+ [( K* q6 r* W  k8 K0 D, U6 z: Z! @     i++;}6 `$ P& P, c2 f

$ Q1 D% m$ O* F4 [printf("%4d",link[h].number);
& E  w) x' `3 f' k  Llink[h].number=0;
2 {+ i6 v0 j( E# `. f- [count++;' W) K6 M. n$ ]! u; w& e! }$ c2 y
}
' Y/ e' r0 o% e
, Q# ~& t9 i) `; n' V* }9 ^3 f, Vprintf("\n大王是:");  }. w3 ~/ X% b5 z
  for(i=1;i<=M;i++). t0 g5 [; ?/ u# G! U: X
  if(link[i].number)
$ ^3 \7 S. T4 J7 d- ~    printf("%3d\n",link[i].number);
# K+ O. J2 S3 a- H  e2 B- |5 v/ L8 U. N2 O; n& q0 n+ {1 J/ d
. N  `" J/ W& K0 F3 u7 d  k( O
}
/ t$ Z% [: y4 F, ~1 S- }/ C1 E
第三种是普通方法for循环
& R6 m1 j- ?0 |2 S( I4 {
#include<stdio.h>, Z4 v* v9 ^! D9 l  {! l. F! u- o; Y
void main()
+ ]1 v2 h8 N3 {* o) M{ int i,k,m,n,num[50],q,*p;
8 `1 C8 \# Z# \9 ?9 m    clrscr();
; ^! m" f4 i6 e4 g+ j5 u7 p1 n   printf("input number of person: n=");
* d' Y7 T% K3 u    scanf("%d",&n);
6 e+ J0 n! X+ D  i+ L( _printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
/ r7 ^) D; l1 p& e: g  l    scanf("%d",&q);
# X; w9 m1 H  t/ T$ i' B: V# a   p=num;
$ y8 Y3 X3 Z$ u3 T" }, P  for(i=0;i<n;i++)
- ?  y, y& ]$ X" a8 X- f0 o3 k7 y    *(p+i)=i+1;1 V- T& X6 X" B  Z0 Q1 D% O
   i=0;
* a9 P. u% ?* u& R   k=0;3 W* s' O! W  E7 y' `. U
   m=0;
& m$ y- P( c& V" a( {6 d1 t  while(m<n-1), D4 Y2 \& M+ T" x# m! x2 I* u
   {if(*(p+i)!=0) k++;
7 f; w- J4 o( a7 F     if(k==q)) D; j6 ?1 [8 h% |$ h/ O
      { *(p+i)=0;+ j% M$ \: Z4 @% e) U
        k=0;
. d; M, C# n7 s        m++;# k+ p$ _) k9 q" O& u# i9 a: ~
      }. C( Z( D' @: _, F# d: s
    i++;
  S+ K8 R' h7 V    if(i==n)i=0;
" ~! J" G0 K0 x# @- j/ y   }+ Z: }' Q  R4 l2 ]- L3 ]4 |& Y" a8 T
  while(*p==0)p++;9 r* c5 O+ f$ G, N% D3 d% q, P
    printf("The last one is NO:%d\n",*p);
, e) ~9 [0 E- h) g" [     getch();
: B0 N( v) Y* J8 h6 p3 f; u" A3 p$ j
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;" r! u9 Z  E6 v1 |1 R) c
namespace 又费马达又费电" t- J; ^1 g7 f  c
{
$ r. ], D7 }9 P1 E    class Program
( r. C" M6 t" s    {" w2 B' z+ L0 ?- k; B+ ]+ e3 j
        static void Main(string[] args)
# T% h4 u# f# i9 `        {
* R2 k- s) m: p( [/ y% ?! h            int m, n;
7 o6 o3 q3 m6 H' c. A/ G* A, E            Console.WriteLine("请输入数组长度");
0 m( r3 G1 \8 j            m = int.Parse(Console.ReadLine());//m为数组的大小
' y/ B/ S8 F9 ~8 V: \            Console.WriteLine("请输入要截取数字的大小");' _4 k8 C5 `* J* p; k  B
            n = int.Parse(Console.ReadLine());. a2 w" s1 _$ i  u" m- m$ k! g
            int [] numw=new int$ b6 C5 F0 ~+ x% x
7 X' }) c; s6 x9 g$ r2 z% {
&shy;&shy;&shy;;
$ P4 g* c8 K) ~* _# h$ {! v6 N            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
+ L6 s% v) I% o9 K" B! ^& j! B: n            {& A; e4 h6 [* r" _
                numw[j - 1] = j;
% x% ]! w# e% V& |9 m            }0 z& r6 Y- l9 E# w- P. ?4 b' @' |
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!% w+ i$ S8 P# |) J6 [4 l" b
            while (d != m - 1)
3 p) J; g2 ]  F9 k+ \            {
& A! [/ x9 R: d. Y1 W, z                if (i == m && d != m - 1)3 Q  l  a# M$ K6 w9 m
                {' n: @/ K( ~, R: a9 w
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
4 ^/ X& i1 x; g                    continue;& O5 M- Z7 x/ ]* ?) }
                }  v. g9 J9 C/ C3 N' q
                else+ V" v1 l6 [, K- x. x1 W. h
                {
7 A" n5 p: [  E3 I. T                    if (numw[i] != 0)
. \5 M# {# \: G' x, X7 k                    {
0 }/ B, }9 l& e0 f$ r                        i++;7 i! ~0 O0 E' F, M; i
                        k++;5 C) k6 q- O; _+ S* E- C8 n
                        if (k == n)7 s& L# _6 D- \
                        {
0 A5 B- U0 m$ G- }( o                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
; e: x! ?& ~0 T& d0 `8 W+ p. X; J                            k = 0;
. L. S3 o( i0 ^/ o! O0 q. B              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
+ X/ R4 U# Z% k                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);0 T/ K2 M) u, n/ `
                        }0 G7 V& q: o+ r
                        else//输出暂时还没有改变数组元素的值
# Q7 y8 D7 I, W% g                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);, v% m" f! D8 ]/ E
                    }# T5 A/ `4 ^/ L6 ?1 Y- x! G
                    else
! m5 k4 D" x, ^2 d% W  @' T                        i++;//数组元素为0,直接跳过,不计数。。。' C9 y/ x6 T) b5 W0 {' D* Q
                }
( h2 }/ I9 Y, X2 c: ~, Z$ x3 D
5 a$ t2 u. y! F! ^( E( C
. ^* e0 S2 ]3 i: C1 R            }//结束while循环9 z/ r+ P( u$ W7 H# }
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦" J( \$ }* m2 ~: L  D9 {( p
           
% X7 G% f4 G6 D, Z                if (numw[i] != 0)
1 ]4 \: {$ L1 S9 `                    Console.WriteLine(numw[i]);# ]9 K7 D1 J/ ]. ?5 X: N
           $ N! g' |2 k" r1 B" D7 f
            Console.ReadLine();( q' Z9 a: [$ o2 ^" \: v) U
        }, |/ x" q% G! B6 @1 X1 o9 |
    }
0 S' R; Y- x' \5 C( o9 Q# t9 r}
! u7 P( |  [; E5 d' A1 R
小甲鱼最新课程 -> 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-13 01:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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