鱼C论坛

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

猴子问题

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

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

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

x
大家好!1 O$ X3 \/ ~2 @5 A2 Y* H- u
这几天我在忙着编一个问题,我用了一种方法编出来!/ e- e  z" g& R: C
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
) e; i, m9 r3 E( X2 O注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
$ h: t( y# b# }: x, d. D0 u; k: \. r
5 r2 A, I) ~9 S: i+ e  K: m( j
: G' z* Z- k9 U. o" f  \
                            题目
9 N* b1 h, T+ Y) h山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
# N1 G8 s% f2 k' z9 b( g第一种方法:利用循环链表
8 \( I4 p, h: `' L/ S#include<stdio.h>
( N+ G; Y" P" x2 k; c#include<malloc.h>: A( D, d1 ~# M' l7 S
#define M 8            //共有8只猴子$ [- r2 ?- |$ _3 }* c" a, w2 L$ `2 D
#define N 3            //数到3只时退出第三只2 B9 g/ ?) W# @/ Y$ Q; t
typedef struct monkey' k+ k6 \7 |& A' y+ [9 p
{int number;
) r5 ~! {% f6 A  Xint flag;: Y1 H0 S! c$ Q: g& K& J
struct monkey* next;$ @* P) y! f+ X2 E: i3 E
}MONKEY;+ U% U6 W1 ^" \& H, z# e
main()
/ W4 i$ L2 |+ g{ MONKEY *head=NULL,*p,*s;, j. x+ }' x  a
  int i,sum=0,count=0;, O% R+ _/ \5 s; ^8 X5 z; \
  clrscr();              //清屏
/ T  {9 ]* \+ A3 }8 k  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
2 j6 x. [! r! N4 }8 p  p->number=1;p->flag=1;
8 X6 c2 }0 W; H  p->next=head;
' ^) o$ m; @3 R9 v  head=p;! @( H8 k  Z' T7 u
  for(i=2;i<=M;i++)
1 r: y# C4 ?: Y0 o# m% U    { s=(MONKEY *)malloc(sizeof(MONKEY));) {3 B+ V) z% r/ r3 D
     s->number=i;s->flag=1;
+ q4 \0 O. C: L; A     s->next=head;2 W( M2 ~4 v& X
     p->next=s;p=p->next;& y$ ?2 R- I# P4 F; m. g% R
    }3 @( L! t* H, D9 P. k
    p=head;
/ U( m. j) Z9 `8 v0 v, p1 U+ L! V% \# M   for(;;), ~3 K' @1 {0 k5 B' r
    {if(p->flag==1)% q! K2 X5 ~" ~% z3 E" N" U" W
       count++;
+ P; }0 u* B# P' u+ S, ^1 F; _$ e' _     if(count==N)
4 L! G% b$ O& D$ v1 l+ R+ E! I$ Q        {p->flag=0;" _& J2 T5 A) p" O! n8 ]
         count=0;
* n3 f2 O$ U# \9 T* a4 {7 O         sum++;}* _% n5 e9 s! n7 C
     if(sum==M-1)
) V1 K4 o- K! b) @6 G        break;( b+ F7 x- R! N9 P# W" f7 F
     p=p->next;
4 c( y1 X) M. ^- A& I    }
6 Y% W0 F. y4 G! }$ Q    p=5 T' m/ n5 Z% @# e% K  h
    head;7 S4 o$ M& p# Q* l$ R1 z% y! s
    for(i=1;i<=M;i++)* I" l7 x0 t. d& ?$ ?2 J
    { if(p->flag==1)
6 P1 Y& w: H" x6 F# r        printf("\t%d",p->number);& Q9 _' T  p1 S+ Z2 h" K
      p=p->next;
) K$ u$ s* x& [; l9 f6 S    }
7 {! T" ]" \1 J  X# {4 u# n1 W. e& E
  p1 H  ?  n( T6 s( C- M% B

; Z. ~2 s. ~  x3 v+ ~, Y4 o) s}
2 C; M' `# `' B- u$ g. f
第二种方法:数组, S0 I8 S( l6 Q
#include<stdio.h>- W7 o/ o3 ?" i& h7 D, Y
#define M 83 k+ |) g8 T/ ]9 f  I# ?. Y( q
struct monkey
. {5 s+ n6 z7 n+ j6 c: A{int number;2 t; c1 d/ m7 S/ B8 M6 l6 O, _, A! n" C
int nextp;
$ v' @0 \( g* r' K: a; w}link[M+1];! n0 M- I& k! S) t: W' g. K# Z

: p+ q. y8 A! o  c3 c/ n. bvoid main()
; I  b6 j. A0 r2 w8 E: G; M{int i,count,h;% W" `% x5 ?* _1 e) ^+ Y7 p
for(i=1;i<=M;i++)! c! S) t0 u% U% @
{  if(i==M)9 C) e/ v+ a0 t2 j/ y5 E
   link[i].nextp=1;
; P$ F0 x" U) E. ]6 N! M9 j9 ]7 j   else" W, m& X3 k3 U& o7 s3 n, Y
   link[i].nextp=i+1;
$ `/ }! i/ z4 W/ \5 g$ E9 T  link[i].number=i;! o5 v1 U3 j1 k
}* O. D) |% o: g: i
printf("\n");
9 s& \$ I5 b. V1 V# `; e' d+ Xcount=0;/ X' ?, [- t) Z( P1 R
h=M;
" K- f; a( [0 L8 F. M0 E9 rprintf("依次退出的猴子: \n");
) U" f* S# s! m! a4 d' ~: Q$ P; |while(count<M-1)
5 ?' @4 q3 J  O{i=0;8 R$ W, ~& x1 S: @& ?6 \
while(i!=3)
0 V9 |$ ~  X, f3 n{ h=link[h].nextp;, }  g0 s' }0 V' e+ f$ L
   if(link[h].number)5 F3 }9 J8 \( M0 Y0 L/ u* e
     i++;}
' p, p5 [' O) v$ V; o! ~5 U& ^7 a6 P6 L* x- {+ \" T' b* M
printf("%4d",link[h].number);
( ^, W- d8 b+ ?5 K/ c' \0 _9 I7 tlink[h].number=0;$ b1 P7 L/ h$ Z
count++;, Z2 K$ G' Y( ]8 P
}
8 g3 I, V9 h* E# W5 S. S$ B; x, ?* V% @5 N: M3 O0 K6 g1 `6 ]
printf("\n大王是:");
+ C4 U1 l' q; W; K9 ~; ]  for(i=1;i<=M;i++)/ S: `; |$ d& s( T9 S
  if(link[i].number)7 f! u7 C4 d+ p
    printf("%3d\n",link[i].number);
# H6 [0 [0 a! ]5 {
1 ?, m& ]) [+ C0 Q3 T% B0 z) P. v, F5 q' M
}
& @' i7 g9 Y# `, ?9 W( r' k
第三种是普通方法for循环
, B5 c- p; D6 V- F( ?" `
#include<stdio.h>+ q4 j# P3 z/ [! m. K
void main()
% t; m+ V1 D3 S{ int i,k,m,n,num[50],q,*p;( ~$ |% O( a# @) X% W! Z
    clrscr();
6 [3 @4 @& B: m7 H5 }9 k   printf("input number of person: n=");
0 W) i/ U8 K, V3 k    scanf("%d",&n);: [( F+ v9 p1 u. s% z9 z/ c
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
$ ]" @5 {* ], ]4 r0 R/ g    scanf("%d",&q);. |1 a+ n) U6 o5 b; ~* o
   p=num;
4 W& @% s6 ^, V6 n) \! S/ B' m" i  for(i=0;i<n;i++)# H2 m# S* z% A; I, J0 v2 W- }
    *(p+i)=i+1;
' Z6 C0 T; Z) }( E% }5 [4 ]( ^7 z- R   i=0;% y, G/ B# x7 H' ?- H- _
   k=0;
0 B% O  @0 D- d   m=0;
" z5 _7 y4 h& J$ T* z  while(m<n-1)& Q+ n* J, ?0 y+ Z
   {if(*(p+i)!=0) k++;2 ^& L5 f. `4 J0 W
     if(k==q)4 F& l( z; W) [, A. U/ G
      { *(p+i)=0;
. e' `/ T, x3 x2 s) V        k=0;
4 ]: C6 B5 w5 l, {* x: C. U9 C        m++;
( ~- q1 t9 O8 H) G( v* ^4 L      }
8 Q% {- N: Y3 K% [    i++;
8 z$ h. s: ~( G* x+ w! R    if(i==n)i=0;
2 t' ^5 b1 h; T# J  B   }
. L. N/ g) I7 z2 A, f3 z* K  while(*p==0)p++;0 E0 d6 o9 u% v7 _4 Y; O6 o8 m
    printf("The last one is NO:%d\n",*p);
1 K& L6 C% v& ^9 d6 R1 ~     getch();( Y( _1 c/ D% a# h, j% _9 i
) n4 m4 I: f* D2 |
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
* @8 W- F( D8 X1 K% Onamespace 又费马达又费电7 t) Z* ~) P4 \; d& G/ O
{/ z' q( t+ q* @9 C1 b7 j- r
    class Program
$ H3 r' L5 [2 O, G5 B, h    {
$ @. O& H. B6 l3 \5 l; Q# v        static void Main(string[] args)8 |& t6 E: C5 b
        {
) N4 g8 p' L$ p& Q, S            int m, n;
1 s, M) Q2 \. [8 \0 X7 e5 W            Console.WriteLine("请输入数组长度");
- c$ s$ [4 d4 {. c) @            m = int.Parse(Console.ReadLine());//m为数组的大小) O5 C- ?+ N/ j7 f& u+ Z  Q/ B! y
            Console.WriteLine("请输入要截取数字的大小");
9 M2 G2 t' u2 L$ N0 n7 {8 s1 n            n = int.Parse(Console.ReadLine());
% [$ V: k+ }9 Q# A6 r; S            int [] numw=new int
/ v% U$ Y7 k( ]/ ]8 C9 V. B! i3 J4 z$ N& B8 y5 N) A& C% q
&shy;&shy;&shy;;4 N4 M6 F9 W- c( M$ ]. M4 q
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数3 o; y1 ?* _4 T( s
            {0 `% V8 H5 X# R+ p2 b. z  Y$ d
                numw[j - 1] = j;
! }3 g8 [9 r9 y5 {3 c. B# B4 {            }
3 P; N# j: j6 j8 L5 h            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!; t+ X2 l, a  L; R0 a: b6 J' R( j. m2 x6 I
            while (d != m - 1)
/ p( d6 \/ f3 {0 T4 {3 v" E& @            {; Y+ ]+ }- O+ _: X. u8 ~* x
                if (i == m && d != m - 1)4 h; F& ^- `' {7 o! H
                {4 @2 u6 K! A6 Y* o2 n
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
# {' w1 t$ H5 N8 F. w" e                    continue;: J( |4 F8 H6 C
                }
1 U6 H% `/ ^( g) J                else# N1 I  B. b; N; N* S; `* D
                {
- @& r# {' D9 }# v% M                    if (numw[i] != 0)7 q' r4 w1 z) C, [; n
                    {+ m4 h3 q2 l) D* P$ ^
                        i++;
: b4 D7 _: M8 n8 T- `                        k++;' B4 ^2 M8 @: F8 u
                        if (k == n)
% a' o" ~9 Y  H3 h! m* y8 C% N                        {. T, j7 ], y2 N, n, O+ E1 H
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
, b% c  K4 `/ \1 f9 W% N3 H$ |3 [                            k = 0;7 }$ f$ J: d. |( \2 W
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
2 @3 }9 R* N) H6 K/ D                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
  J9 a6 f  b6 O' }% R                        }! m( M, M2 u7 v5 a+ w
                        else//输出暂时还没有改变数组元素的值3 m. n2 V% [, v8 X
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);% r9 p4 i* Q) `* `" `* X+ W# b3 w
                    }- ?* H# q# z) ^7 I0 h5 G
                    else
. p/ U& H/ u2 s  v$ v; h9 R' `; I                        i++;//数组元素为0,直接跳过,不计数。。。
1 B5 q1 z2 X0 S$ o) _' T. Q& E                }; [: u/ c' w; [8 n
( y/ b, h3 _+ d/ ?# c% Q1 c  ~
' I* q* k+ L) a. T" S& l
            }//结束while循环9 n$ t) S: |2 f( w
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
/ m5 ?/ v/ W9 R7 V           # T1 ]: K# n( K
                if (numw[i] != 0); o/ {5 J& H/ e% m4 \+ ?# P* l" m
                    Console.WriteLine(numw[i]);
7 V5 V5 L; p/ T# B: m5 b           
2 m6 h7 m# F+ M/ F2 m            Console.ReadLine();
# M0 ]0 |6 f1 E7 G% q* s        }. @( j/ t, g- Z, ]- }
    }: \, u) f) x- v3 b3 U  O
}6 O2 p. a$ F6 V* t
小甲鱼最新课程 -> 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-3-31 02:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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