鱼C论坛

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

猴子问题

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

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

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

x
大家好!
5 i$ s/ y: r! K( S: Z, A" T& @这几天我在忙着编一个问题,我用了一种方法编出来!/ F# l+ Z) P% j) h. d5 Q4 R
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!9 M% R" E) ^) H
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
5 O( _# l# L7 o. H" Z7 J0 w: j$ v2 V2 L/ }8 j  Z
$ D, _7 K* N; E; g2 ]0 R# c3 b: g
                            题目; x$ B" }3 }2 p7 w
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
/ w1 F5 B& {. s2 P' O  Z第一种方法:利用循环链表
# w# `( p* I2 W& ~9 U#include<stdio.h>" r4 u/ U* k/ }# G
#include<malloc.h>
3 v3 n9 ]! h0 d; U* X#define M 8            //共有8只猴子3 `. I6 H2 X/ \: E6 I; E
#define N 3            //数到3只时退出第三只1 S# s; ~) I3 I- I3 B$ _; t- Y
typedef struct monkey
& [( I2 X4 @  ?/ j% |4 S4 M0 o{int number;! J# |6 T. \% P. A+ `/ U
int flag;
0 o& X" r8 L# D/ Q, Z1 pstruct monkey* next;
( g+ C! E" ]' |+ \" E( B5 V; V% C}MONKEY;
0 p! e( f/ R+ i/ D# X! Jmain()
# T; Z; }: H, _{ MONKEY *head=NULL,*p,*s;2 d+ r9 b& U% p7 K* j
  int i,sum=0,count=0;
% A/ \) g  u/ h" J& {6 Q  clrscr();              //清屏  i/ s% e! u+ v3 J. ~
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
8 w6 [) [* s( q9 F9 C: i  p->number=1;p->flag=1;7 |/ |0 v! Z0 z( S2 x9 K' d6 q
  p->next=head;
4 p! n# }) H5 W  head=p;: h5 w: I5 S! J
  for(i=2;i<=M;i++)# X' N6 h1 _- r- Z
    { s=(MONKEY *)malloc(sizeof(MONKEY));6 W+ s& T1 x% }+ _
     s->number=i;s->flag=1;/ @1 w5 [9 R: e/ |2 }4 S
     s->next=head;
6 Y. L: J5 j, S+ r' s9 q' R     p->next=s;p=p->next;
% [. K  L& t. Q    }# h/ ^( u" t  v
    p=head;  a9 ~/ E. K5 a! B# \/ H
   for(;;)
; D2 e) |( H) \  T/ W    {if(p->flag==1)
* O1 r- S" ^" O" j' U       count++;
4 L9 V) E! G6 `/ D- v     if(count==N)8 K2 h' L! ~% @# u* r
        {p->flag=0;
. L2 b# b: a( o  U) C: h& W- R3 @         count=0;
4 c& A+ ^( T4 Y9 B4 @0 s         sum++;}
3 }1 f$ \7 f) J2 g3 q     if(sum==M-1)
' O# J. m6 V$ @        break;
! A" z1 T2 W$ I" r     p=p->next;
$ f! `# y7 G& p' G! K. V- z    }! y' _4 F; @# d2 A& x
    p=% v4 g' ^. R. r
    head;
/ _* C3 m; o. h. @/ O    for(i=1;i<=M;i++)
+ a7 w9 m! {/ k; i5 W8 m  d    { if(p->flag==1)
7 r7 c$ Z" Q6 o1 f) a        printf("\t%d",p->number);
! D! x5 g# J( l+ o5 Y. k9 ]      p=p->next;
- O! z8 F2 R1 J* y9 K# I    }% g/ I. d% o! p# e6 c, q( t

+ u- n* I) t7 Y/ w- X( [
1 \! G1 k5 r8 S* i
- }) X1 ~4 n; m( u}

' Z5 y1 c; E) U第二种方法:数组
6 P7 d" v3 b! x" R#include<stdio.h>* {* D+ Q  q! {$ n" J/ p
#define M 8" @) }6 U3 Q3 Y( w6 W  V+ s7 q
struct monkey1 F6 J+ l' B' J
{int number;
2 J0 w3 U* l. }' U& C' sint nextp;
; i1 I- j6 J% K. x, a) r+ O2 s}link[M+1];
9 N6 ?5 B( @. H* a
* \: k  F0 b( j* Xvoid main()
- g" b4 y+ p$ B9 |7 y7 s1 T{int i,count,h;
# M$ d0 o: L: j1 c0 T: c: n9 _* hfor(i=1;i<=M;i++)
3 u" V" j8 o9 g! L8 a1 g2 Z{  if(i==M)* _3 E2 F, v" D1 U6 R$ M
   link[i].nextp=1;
( w( @  b& Y, d# y% M8 ~  {   else' s5 c& [7 p+ o6 X* E: M
   link[i].nextp=i+1;
, m8 o( y- W. b" p0 a+ c! P6 t  link[i].number=i;
! U  f5 p/ }7 E0 E% }! y}$ [8 h' N1 Y- w+ s7 Z0 Q
printf("\n");, I* m- ^' U9 q0 h% U' l/ C2 c# i
count=0;0 c* T0 i6 g# r' U9 j* [6 ^
h=M;; N7 U$ I2 [# f* _
printf("依次退出的猴子: \n");
- |( l! g; C) Q+ K/ l6 X' Gwhile(count<M-1)5 v  ?! D3 h( Q; p. O
{i=0;  H+ m3 L1 V2 v/ h$ z7 [
while(i!=3)
$ h. }% Y9 w+ L, T* u{ h=link[h].nextp;
5 q2 n( y/ N! L' Q9 Q& b   if(link[h].number)
/ P7 }3 Z! K- _. W$ _4 e6 T9 b  X     i++;}
- S9 P6 O+ l1 M2 ^, P) V
1 _9 r& d3 ^: j/ _6 ~' Uprintf("%4d",link[h].number);
+ a, `/ z6 V$ @( Blink[h].number=0;
0 u; ?1 B( {9 A) C+ Z  `count++;
) Y( p  d' l8 Y* Z  r/ X! p}
$ T, Z0 ~# T7 Y% K& t9 H
- r- `% D9 q4 O% V. ]printf("\n大王是:");( c$ I  Z4 m# K, ]2 r. P9 ^* a7 p
  for(i=1;i<=M;i++)
7 x% S) ^5 s. _) k* {- `+ j  if(link[i].number)! v8 ^+ P7 h4 S  W% `
    printf("%3d\n",link[i].number);
* C2 O3 F( K: A4 X- [8 O0 d" y. o) [1 D4 o! a+ g6 e7 V* z1 K
5 V* f; B0 z6 K9 L% q% e& v
}
3 Z! L+ r2 W; A3 N" W
第三种是普通方法for循环
' W0 J2 ]# L6 S1 q
#include<stdio.h>
' I3 M6 k3 ?( w5 T! |1 k, S" |% k& ovoid main()  I/ p$ E3 \8 S& x, X9 Y
{ int i,k,m,n,num[50],q,*p;5 e5 f* {* j; F5 f; v
    clrscr();% T, J# K" n( r* V1 B  Q
   printf("input number of person: n=");- F1 X* G5 T  B3 G
    scanf("%d",&n);1 I1 I. I2 g! k! n+ o6 d
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
1 t4 y* m7 w3 ~6 h    scanf("%d",&q);
6 f5 v3 k- g; V$ N* @- t   p=num;
6 b; e8 u; _, h; |7 ?* o  for(i=0;i<n;i++)) N) O+ n+ i5 t7 x% G# p; D2 T
    *(p+i)=i+1;
7 n9 X: O# A0 F. ~   i=0;) s* y3 z  u9 c5 M, L, f* v
   k=0;+ r4 ?, b- w! W5 h
   m=0;; X% v4 @' {2 S4 Y' }0 h
  while(m<n-1)
1 O) k0 `  g8 f* m' X   {if(*(p+i)!=0) k++;
) ]2 }5 u) q3 F1 F     if(k==q)
, F8 j; X5 v  j2 [6 V8 l6 `( m      { *(p+i)=0;
- Z; J" j3 e/ g' T        k=0;$ K; k; H0 u5 j( S0 o
        m++;
$ f3 T' l  h7 K; \      }9 J2 o2 a% x8 g8 }9 s0 N0 o
    i++;
; T$ P$ Z% Q1 g( L3 k# P# v7 f* C7 ]    if(i==n)i=0;
! k. d" Y! G0 E# L/ a   }( i, G. R" Y: [9 p! S4 V4 j
  while(*p==0)p++;
" y# m* d$ R) H& }. _9 ~    printf("The last one is NO:%d\n",*p);
8 B4 O$ \( X: X; d     getch();3 D  _( j4 n! H/ c" O

7 B5 Z; I$ O; y}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;& }1 c; T% b, n) o; i$ Z
namespace 又费马达又费电# m; a. z8 K0 w2 S1 P* \
{; `" V* q0 J( W7 {( M+ s. V
    class Program
& u: F4 f* C: f, q- j( a' z+ J    {3 s- @+ ?: U2 c9 ?. n/ C: i
        static void Main(string[] args)
. j7 V9 `. D/ Z1 W2 Q        {
- U! P4 N, P+ G* l" q  w1 p: u5 H            int m, n;
$ N, T9 }0 u. t4 C+ p9 [! X5 C. f" |4 ~( S  B            Console.WriteLine("请输入数组长度");5 N* S1 x5 j$ H& P! N5 k* w" d/ N
            m = int.Parse(Console.ReadLine());//m为数组的大小
3 L3 e% E6 {# q& B            Console.WriteLine("请输入要截取数字的大小");
, ^- ]4 K8 `0 Q5 [" L: ?            n = int.Parse(Console.ReadLine());
4 ^! I+ k, j: N, u" b3 C; v            int [] numw=new int3 i! o0 a$ n2 L2 f  N- h+ \- z

% c8 V9 f! Y. @# T&shy;&shy;&shy;;* Z3 C( a# J- i! ]
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
) D1 n7 j6 P" Q& M, C5 A            {% c. g' k' ?5 x8 G5 A  f
                numw[j - 1] = j;
9 G) o- @) t  j; i7 U            }
" j2 G6 [  F5 _, L+ K, N: g/ P            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!9 f# u: {5 U' [( w" N
            while (d != m - 1)
/ f# T3 }1 G5 G% z, b7 o5 i            {
' P0 O+ Q; {2 T) ^+ ?* c                if (i == m && d != m - 1)
0 b+ Y- x  d) t2 Q. V                {
8 S. X3 z$ e" J$ n3 k                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
- Y4 M% E- G1 N                    continue;9 @8 D1 h7 U$ G! ~
                }. ]- S- K/ l  v( m. d7 B
                else
3 [& j: u/ r$ V# }% P                {
5 i* S+ _, C0 m/ \" m2 K                    if (numw[i] != 0)$ M* X( t. b! Z, x+ W
                    {0 Q5 U" P: u) s; V( s1 ^6 ?
                        i++;
' Q3 D! g1 M* T# ~                        k++;
2 g  R% I; @1 {1 V                        if (k == n)
& m' q2 B* k/ C" ^) |4 ?3 x0 s                        {  g! R- p, t$ Y" y/ _8 I2 Q9 G' z
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了! i, G, \0 j( @( Y) n; J
                            k = 0;
( a( Y% x8 M- e  N! }1 h  i' H6 E              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
* k  F/ r: J1 m  {                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
0 [' ^" P/ K: D! W  J) A% p                        }  J4 {) q0 f) u" K9 Y
                        else//输出暂时还没有改变数组元素的值$ L( L# i7 t, k+ E5 t9 C$ g
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
: r; i% y6 T7 o                    }/ p. G7 P$ d3 y: V/ O( M5 k
                    else: L% y3 K/ ^- W& \
                        i++;//数组元素为0,直接跳过,不计数。。。
  c3 u5 l8 W( z) I/ A7 h. t# i                }, Q' K" O; P' G+ n' u: A& J: g

6 B8 Z3 e, }! S3 Q1 L$ P7 t2 |) _9 o. b- b" @
            }//结束while循环
  G; t0 X& v( |' l: i1 Z            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦0 @3 a# X1 _1 {1 R6 N
           
( S: k& c8 b- Y, j                if (numw[i] != 0), E0 `9 c% D+ q- r: O5 w9 W7 i  G
                    Console.WriteLine(numw[i]);: w% B/ v; K0 j" ]6 t$ m
           / x1 \0 \; C& r. J9 e2 `8 h' w, e
            Console.ReadLine();
0 h- f  v% [8 X: p0 F        }# T7 j# {3 O; ]& b7 m
    }" V9 a6 l1 D- w6 @' o( g
}( o, t0 J* q$ ]" D
小甲鱼最新课程 -> 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-16 06:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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