鱼C论坛

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

猴子问题

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

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

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

x
大家好!
" U7 N; V6 {0 h7 [* r这几天我在忙着编一个问题,我用了一种方法编出来!; E* K( H5 T  ]- g0 m  ~. H
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
$ F( H0 u: u% H/ |- Z# @; V/ Q注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ! g# `6 B5 a# m7 t8 W7 L

; t% ^- y7 X( s4 D% b4 V7 B6 a
4 i/ x& [3 ^% e$ D9 y
                            题目
# d  ^6 e" c& {. s% q山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。/ j. v) i2 z. W; D! N
第一种方法:利用循环链表, w* j! i8 u/ N2 F- o: S' L# `
#include<stdio.h>- s, j% B4 z' _
#include<malloc.h>
0 M7 i' L  f( b8 w! O, h! E# G#define M 8            //共有8只猴子) ]8 K+ N, Z0 @; B  ~0 B0 J
#define N 3            //数到3只时退出第三只2 n; H0 v/ M0 g/ a- S  j: P
typedef struct monkey0 k2 l; B& u: T" R: a+ V" U
{int number;" O/ ~% a; W. G6 r& R
int flag;+ C% y5 H! i  z: @" M/ w
struct monkey* next;/ u: M4 N# t. [8 a2 _" x
}MONKEY;. j8 O# g( z6 m: ]# W& _& h
main()
- n- ^) A) e2 L4 V8 ?, Z( O$ M4 B{ MONKEY *head=NULL,*p,*s;
; H/ B  }7 I0 w  int i,sum=0,count=0;
& _0 O3 q1 I+ I, i  clrscr();              //清屏
: @8 A! n3 f% u+ e4 E5 ~  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存/ l( W4 C# z) \) `* |
  p->number=1;p->flag=1;
1 Y/ C1 @  C' A) }) \# T3 i) y  p->next=head;
1 M7 K  n+ ?) ~- J8 W* q. b  head=p;
  |2 B$ @# e+ Z7 [: R; ~5 J  for(i=2;i<=M;i++)
0 m) g% X0 W+ F1 P  b: E    { s=(MONKEY *)malloc(sizeof(MONKEY));8 b3 M2 e* ~: C
     s->number=i;s->flag=1;
6 G/ s7 y. Z4 d. [2 K  y     s->next=head;
  T: W- W5 ?) E% H  o     p->next=s;p=p->next;, E% a. q! e5 |1 e1 [: `4 ~4 W- {
    }! s/ e' t! q3 f
    p=head;/ r9 X2 G2 y& o! C2 Z7 r
   for(;;)
* J) c  `+ L! c- I9 ?7 S    {if(p->flag==1)! f& ?& l, ]; ^3 ]( a
       count++;
" Q0 u5 z0 J# F     if(count==N)& U' {* b! y# {
        {p->flag=0;
2 v* m3 k; p5 o( ~2 j+ Z/ M7 G         count=0;
' w+ c2 c0 m. P: R% g+ R1 x6 y         sum++;}
2 @7 W; ?6 _5 d     if(sum==M-1): @1 b. I7 Z' L4 l$ X
        break;, P$ d: j: J/ ^0 n. E6 [
     p=p->next;7 |" z# v# Q2 V* I$ n: D' P! ~
    }" C2 B/ d4 V2 v3 `. x
    p=  k; m# J# v5 @; s  Y$ h
    head;& u. h" _$ ]* c) J
    for(i=1;i<=M;i++). Q+ M' k+ E, K; t5 x
    { if(p->flag==1)
& r  F* z. F* x, j! m: Q- x        printf("\t%d",p->number);
4 r% ~$ A* u$ z3 |      p=p->next;/ t6 X( P6 o! x. J
    }
- @- z. {- d- _- o0 n: c, Y# L' I$ d7 U$ _
. R$ y3 s: d% q* h

1 z' t. F  Y5 h- V) C/ [+ |}
$ t; y6 D: `# Q8 A8 A6 g9 y, W$ a& X3 d
第二种方法:数组5 t( E! O- z' h( ?2 @# e' @
#include<stdio.h>
( Q# [  l3 \: g$ M) q0 p#define M 8# U- M. P1 |: w$ Q* u8 a
struct monkey7 H0 E+ c# P5 ]( v8 x
{int number;# e5 K. @8 R7 ^! A# |5 W0 T  M6 \
int nextp;( ^; g2 k  O( r5 G
}link[M+1];: H; n! y- V! G$ P8 m# _+ O

) u' g" E; u* F% n+ u: p, ~7 c; zvoid main()
( X% J6 m7 Q* i* }! |7 U6 Y{int i,count,h;
  N, S1 p/ ], p' ?2 ]4 lfor(i=1;i<=M;i++)  g7 p$ m8 s  u/ B7 E+ B; Y/ y
{  if(i==M)9 U0 A% _/ S  z
   link[i].nextp=1;
  |4 S" t2 J1 H0 Y# K2 g  d" y   else: H0 Y8 c6 t. H* ^
   link[i].nextp=i+1;% g) k% j" `  q/ u/ c6 B
  link[i].number=i;. m9 F4 a1 W" Y" Z8 b4 F  ]
}8 d6 p, `  @; A" l' t/ u5 ]
printf("\n");- w3 o% ]7 q4 e
count=0;
& h( E& N8 i# L6 O) vh=M;1 d; q6 `& a$ n) A
printf("依次退出的猴子: \n");6 E# h8 G" L: k3 x+ |- E* Y( v/ O
while(count<M-1)6 e6 l4 c/ \: _$ t. d/ {
{i=0;0 M$ X: A  X$ R! Z5 I' B
while(i!=3)
; U& w& y( t/ B: l  I& A! s8 Y{ h=link[h].nextp;* z5 F, p, T( V
   if(link[h].number)
; c" _  u3 {$ w     i++;}* K5 Q5 I8 M. [. M% u
) [: q4 K* N0 _0 ^
printf("%4d",link[h].number);  m0 U3 R3 ?* X' ?
link[h].number=0;: X9 _" U6 V7 L+ [
count++;0 N5 Y1 D! \5 O; b0 o! y: @
}  h* u! y4 b1 o
5 K% M% T/ r& A; a
printf("\n大王是:");
+ [8 K3 W2 K2 ^. L3 {  n: p  for(i=1;i<=M;i++)
( t. q# ]: \$ ^  if(link[i].number)2 N# W( g& \4 s' t7 m$ I+ f
    printf("%3d\n",link[i].number);
4 W; i; E' C( O
; A3 I: p. x. s8 B  t- \
6 X8 {- |; o7 v/ _% U, |! j}

5 I: z8 U2 w" Y7 @! L# a( ^. o第三种是普通方法for循环

' v" C7 h8 t7 i9 y3 V#include<stdio.h>8 I5 i7 m6 }2 S) c- v8 ~
void main()
& Q: }% _$ a4 S; _4 \{ int i,k,m,n,num[50],q,*p;) k7 F  g0 D. y4 E2 N4 J6 z
    clrscr();& V; d1 o; w. H; h5 m6 `( @7 F
   printf("input number of person: n=");
) J5 `! E' D+ x3 i$ i4 N- I    scanf("%d",&n);
# W" U  _. A% Eprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
; }; e+ q+ W& t; m2 b4 T& ~    scanf("%d",&q);
/ |) Z5 A8 C+ ^4 B/ W0 P   p=num;
9 M! z8 O$ C$ A/ D  for(i=0;i<n;i++)
! Z0 F" J7 o. F  r* Y    *(p+i)=i+1;
( I  L8 R7 W& G) N1 D   i=0;: t6 J3 P' \/ N
   k=0;' S' W# O% F6 x0 `8 \/ j' G3 s
   m=0;
5 d7 u% G) v4 Z- j* g& y  while(m<n-1)
# F" S# w' \/ ^   {if(*(p+i)!=0) k++;0 {9 i. q4 G- J
     if(k==q)
/ r7 M0 ?0 g2 f  \      { *(p+i)=0;% N* h$ n' l) W# d) V
        k=0;
4 g* j) `# O; m5 S- w$ I) P        m++;+ d( ^& j( I1 V) u! ?
      }
& o; w* X1 @8 _+ r    i++;1 d) X* P% g+ \# _5 `* x& a
    if(i==n)i=0;
" V) L0 @4 A2 i" ^   }; c" c4 P, k7 u
  while(*p==0)p++;
- J$ R  w# l0 Z+ q, k& d    printf("The last one is NO:%d\n",*p);
5 E2 j, G* b6 G* z+ a, k& s6 |     getch();5 p% \, ^% _$ B/ O

' k  ~' Z, F# |: Y3 i. f! [4 G}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;+ E6 T, v0 ]: J; ^( `* |6 W7 F
namespace 又费马达又费电
, Q% \) N  b8 ^4 f1 M! q+ f) F0 t{! A# e9 ^" k) e) E
    class Program
- S5 V0 o* Z* T' N7 v; y. z    {7 a  Q; M5 j/ `( X5 `# m4 E. w$ b
        static void Main(string[] args)* M/ @* V9 n; p0 w2 x7 E' L
        {7 K. U; T; z' d3 j. z* r, |' e: U0 s
            int m, n;
  N( X% R# l3 ~% T7 \            Console.WriteLine("请输入数组长度");  D+ U& J3 }) g7 H) p/ e
            m = int.Parse(Console.ReadLine());//m为数组的大小1 H% D' t# \# P9 P# Y
            Console.WriteLine("请输入要截取数字的大小");  P% {& K& N( O: m+ }  q& `
            n = int.Parse(Console.ReadLine());
! `3 L5 r" H6 b6 @4 H  r! j- E            int [] numw=new int% F& y' L5 {+ [' L* O! z

3 `' g; ?5 ?' z0 h) P8 E) n6 C&shy;&shy;&shy;;
$ X1 h# I* I1 b$ {: P            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数& F6 t3 Q2 b1 b5 U
            {4 L9 o8 s' \( R
                numw[j - 1] = j;* n- [' C  m0 h+ m5 ?" o! q
            }
' b5 O" d5 V1 g$ I0 C( T            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!& Y0 A* `0 n: T9 g
            while (d != m - 1)
0 \) M# o. `( d            {
9 T" C2 z5 u8 _0 f! d3 {                if (i == m && d != m - 1): l1 s9 F, b! P- w' ^3 q
                {$ a. r6 g8 u" j
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!: |! l/ {' m/ ~. W9 @# H. ?4 S
                    continue;
) N% o- j4 s6 q, _                }
  |  n- n) U* H+ `' Z                else! @4 h  a3 A5 {) w* O7 c
                {
4 ~7 d. o$ f. Y                    if (numw[i] != 0)
) q3 H. O' |- ^) g) l& z                    {
0 [3 a. E* d( |* L: k9 W8 N                        i++;
8 [  b) b6 t# S                        k++;
2 K9 Q6 l8 J# j: F8 u+ z) w, J/ _                        if (k == n)
  R% `8 n" W, c5 v& U                        {4 h  D' `1 M( _: w
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
* z) @& `+ Z6 T7 t: S/ c                            k = 0;! R( e, y3 J' P$ y
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1* P7 e0 x8 p$ ?/ ^
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);+ q% V$ P; ^- J, O5 b% _  z0 ~1 V
                        }
" I% l$ X+ i; ]: N  I, l                        else//输出暂时还没有改变数组元素的值7 ~) \( J1 a$ Q  t  U
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
0 \7 R: t( D6 h                    }0 r2 d8 |: s: q
                    else1 }; m; r- B1 k
                        i++;//数组元素为0,直接跳过,不计数。。。, k, ^( i$ ?4 k% [
                }
* T5 N- J3 {' D- G+ h( D $ k) V2 T  P7 {
  R9 [6 Z# s' s
            }//结束while循环
8 v2 O9 o5 z3 [( k% d; @) m            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
6 F) e* ?* `$ I9 b- F& q( `           
4 J$ j6 A' g1 w6 m                if (numw[i] != 0)
" S# P3 Q+ a' L6 J6 [0 R                    Console.WriteLine(numw[i]);
* n8 f/ [% B0 W" Z* a! O           2 q6 p9 J- b. Z) z& j: r
            Console.ReadLine();
* i& G* a# l6 C3 H; Q        }2 P+ o" G6 Q+ k" o! I
    }  M8 F, l* l4 O/ k. @5 v- J/ b
}/ @3 Q6 z6 a0 C( }9 c
小甲鱼最新课程 -> 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-12-29 14:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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