鱼C论坛

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

猴子问题

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

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

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

x
大家好!
8 C( W5 n5 o2 b4 ^7 S这几天我在忙着编一个问题,我用了一种方法编出来!0 S( B& g% q% }6 r3 a- ?7 _# _
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!7 i% E+ b' W  b+ Y3 g, P
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
4 j; b! e  T$ K; ?8 A( P! `
9 u7 m! l8 z) B: v  ]: ~0 G/ h1 X& p
* p! y; U% G3 `% D5 H8 m% O* _9 K
                            题目
0 E" U$ Q, p% s' X; a山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。. D8 B2 J9 }# ?
第一种方法:利用循环链表
7 a( U. D; P( n+ `8 S3 _#include<stdio.h>6 |' z6 V8 P! s5 t/ F
#include<malloc.h>! K& u9 @, T* T1 U7 l2 r) M8 a1 t
#define M 8            //共有8只猴子2 k3 B8 ]1 A; u  ~- W3 ]
#define N 3            //数到3只时退出第三只
3 y, j% D* z4 I% ~  Itypedef struct monkey, u4 v" z$ e% s& N" [: D; B6 d  I
{int number;  t% T  y! F6 h, E% v6 p
int flag;
" G) l* ^4 l+ ]2 y" ]3 |struct monkey* next;
" U$ A; q/ g- S2 a* r+ u}MONKEY;8 c( P; C) s* G: K/ F  i: v* L
main()( y. h7 T- z( [  \) w
{ MONKEY *head=NULL,*p,*s;
( t# e4 K: K6 b8 `  int i,sum=0,count=0;; N2 H* h: ]% l2 S" t& @5 R& @
  clrscr();              //清屏
* g( D, T" B$ ?, Q$ F  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
! R! I5 r2 N; S( k  p->number=1;p->flag=1;1 H" I* o6 O% e9 u  b
  p->next=head;8 Y' j  J9 Z* D6 n
  head=p;3 t0 s) y+ y  ?$ T( M
  for(i=2;i<=M;i++)
, l' t7 h& h; h- r! y& Q7 g    { s=(MONKEY *)malloc(sizeof(MONKEY));) Y( H) Q' I" o( ?3 g* _
     s->number=i;s->flag=1;
! j( ~  ^& P3 s' r- `: S9 U& G     s->next=head;
) u& g0 a( c1 l3 A9 F1 d% _" t     p->next=s;p=p->next;( j8 z" P( j. f, n  [8 h4 l
    }) f) d/ |0 H7 S. T; j, |. n' ]
    p=head;
- |) F% [; U; t' X: @   for(;;), k7 c+ R; T1 u4 m9 o4 g
    {if(p->flag==1); F  \0 a* w9 V& g! Q0 \
       count++;
, G2 }1 x4 ]( E9 ]     if(count==N)
) ]6 _! v, h, w" z        {p->flag=0;9 H2 ]2 m" `4 [
         count=0;
' V! B) ~. W! i; F, n         sum++;}
& v& [- U# a2 l! i; y. D     if(sum==M-1)% z. Y7 m' k. U$ o0 y2 j; [" M3 W% G
        break;+ R" G* `& z( \, C7 H- O
     p=p->next;
) g' O8 @9 i9 R8 ^3 @9 c" `+ H    }
$ T- F; b, ~5 ]6 k* [% p4 {8 O% p    p=
( W2 [3 f* X. N9 X2 G    head;2 ^  v) l% n& `6 x
    for(i=1;i<=M;i++)
$ X2 W. s1 w* ^4 u/ ~% P/ |& c    { if(p->flag==1)
3 L) c) G$ ~8 Q( t& }: y; N1 m        printf("\t%d",p->number);3 f8 |4 V# v, j- _6 g! W: J
      p=p->next;2 S* c: |# l. j" p) B
    }  n0 S2 }: m3 C! z* y! S5 N
0 U1 O: W0 \# |% x9 D
: ?" V8 s1 ~  a7 @4 n
( C# e) {  Y* \- G$ |
}

3 r8 i1 f1 {. b' f: M: v第二种方法:数组
, R7 i* T+ u7 q" U#include<stdio.h>7 m  }$ L5 `0 I2 U; _2 c! K
#define M 89 u) @- Q  c2 a7 W+ C
struct monkey
: w, |& n" {* o! O8 v5 D7 {{int number;# E9 _) B5 h) b! N
int nextp;3 T" U4 a. f, h) A5 ?0 l; Y
}link[M+1];
* ]" D. ~2 }  D6 X- ?; v8 ^% w( L8 O1 y! O; r
void main(), l: N) X* \# v& W; X0 s
{int i,count,h;
. _: q1 y& [+ r7 j; Bfor(i=1;i<=M;i++)
* s7 @# X5 V: W# Q{  if(i==M)& M" j3 d5 B; c0 `
   link[i].nextp=1;" O& c4 w  R2 ^2 e# [6 s( `
   else
! C. r& l4 E$ H" z1 K9 q   link[i].nextp=i+1;
: J% m4 F: s3 X6 z0 j  link[i].number=i;7 r) M& t- z& U4 Y3 i7 E# E" N
}. ]& A1 i: K9 O  R) D
printf("\n");* t7 [# u- B( ~/ `# G5 N# u% ~, Y! l
count=0;
+ D0 Z: e2 Y- @& ih=M;- _+ `9 S, {  P
printf("依次退出的猴子: \n");- X( s- Y$ }1 L  b
while(count<M-1)0 O% O% ~8 e) A2 r- ~
{i=0;
7 F/ p. {8 a, R8 D+ E8 Z* qwhile(i!=3)
: P# R- C! F/ D3 e{ h=link[h].nextp;! d9 ]& h( r0 N
   if(link[h].number)
( \! I% @0 y. {5 K3 o     i++;}0 t2 g: g' E; t2 U  Q

6 O# _8 C* N2 b% |printf("%4d",link[h].number);+ r1 g3 ~. S# N1 A% n& {/ D
link[h].number=0;
7 r- R9 k8 ?, |) B2 h' }count++;
0 R3 o8 y, |; M; B" k6 B, O}7 n- b& z' L6 _- L7 l
. o9 g% r) c# U& O" Q3 E/ W
printf("\n大王是:");
' e$ o, Z2 A9 L3 s  for(i=1;i<=M;i++)( v2 h3 \. K& O, {
  if(link[i].number)
# e7 }1 @0 {$ q6 N$ ?( x/ s2 f4 }    printf("%3d\n",link[i].number);
. |4 F9 }5 c  P  P! t" }5 V4 S; A# Z: \" i3 t, E
! e  i: b6 \% @  t  V. u1 C
}

3 [6 l; X5 g7 M2 Y) _第三种是普通方法for循环
2 o, c! B  i5 Q
#include<stdio.h>9 `0 w$ A  s! n3 ]
void main(), w1 J- w3 W$ t$ \
{ int i,k,m,n,num[50],q,*p;
- p$ g' F/ a8 B- C- s    clrscr();* m; F$ Y0 r( f9 R' u- y
   printf("input number of person: n=");
* u# C  \2 U& B* J5 y( C) `( q    scanf("%d",&n);
8 o: w: ~! ]% u' ~$ V4 Eprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
& d0 P7 v% Z! i+ u" l    scanf("%d",&q);
9 F" _: o! W1 p   p=num;: {. [& V2 a$ M; e3 N4 p3 |
  for(i=0;i<n;i++)
9 r& v# F4 X# S2 O" j$ F# b    *(p+i)=i+1;
, ]' w  |$ u  B; v0 P/ m   i=0;4 p2 D* B+ Z: f
   k=0;/ l6 \' K7 F) l. N  ]) t. ]9 u
   m=0;
1 i& H' |9 Y, k$ n6 k% `  while(m<n-1)
' a" L3 L& p  ^4 O) g" j: {; ^# k   {if(*(p+i)!=0) k++;
( O+ l: }5 A+ l& j4 Z* N4 J& E  N. b# f     if(k==q)
8 Z9 b6 J9 f3 X/ G* l7 r      { *(p+i)=0;
& t% ]& q. \  }( m8 g        k=0;
" v$ A  c  q# d$ U# N0 h        m++;
) p/ q( t, |% h% C1 N9 R* U, ~6 e      }
: B3 r* v3 J5 J+ k7 I/ [    i++;
* f# q7 Q8 I3 X, k5 z    if(i==n)i=0;. `: z( M& K! J' [7 Z1 ]# O
   }8 g$ ~# u5 ]+ M; ]' Z
  while(*p==0)p++;
& p" Y2 T6 d/ ?+ ^1 |    printf("The last one is NO:%d\n",*p);8 C$ x4 Q% M- r' B
     getch();( ^6 w. E5 y: p' p1 Q& ]9 Q* w1 E

% S# w; `' Z" r& o% M}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;5 [, R  H: _7 \4 Z
namespace 又费马达又费电
* o$ Q7 P2 O! C# Q{
+ P0 Q/ k  ]9 C5 X. |    class Program
" w6 e! g/ F7 o+ J6 o6 G$ J) A    {9 w" K3 ?! o1 a" \2 l" Y* V
        static void Main(string[] args)+ O) M! E, A  b: m  A
        {
( O) o* `5 w0 _            int m, n;8 L6 y# V- b' c1 U$ O7 k. e
            Console.WriteLine("请输入数组长度");
6 u" ~" A; ]  _% V5 |: A& Q            m = int.Parse(Console.ReadLine());//m为数组的大小
: i- w, g9 Q* `" T- `  j8 H            Console.WriteLine("请输入要截取数字的大小");0 @6 A4 h& T1 G, P) m  P0 s# @
            n = int.Parse(Console.ReadLine());
# E0 i0 B0 m- i3 L            int [] numw=new int
$ m' T! p) |$ U5 a) B) i5 P3 g. h1 x" K# ^" t6 ~- k
&shy;&shy;&shy;;
- l+ U7 J+ R, ^9 ^7 F. D            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数. ^3 E- y7 f8 a2 X6 H# j* p) s
            {
: }! h3 w  Z& P9 H' M( w                numw[j - 1] = j;
* ^/ m4 x2 S3 _, s            }( ]  a+ A5 T) }. I& ?
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
3 T# C! X0 [( V6 P            while (d != m - 1)
$ f* c, z  B3 q: s" j1 w) f: `            {
" _" E, P/ T8 }: d( G                if (i == m && d != m - 1)
5 ~  q. E; f6 m8 B/ `9 G# I                {
! M' S# V5 f5 _/ h4 r                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
" w# j. W4 {& g+ W/ N                    continue;
3 b  s8 R+ }! U                }
" K2 `: ?2 i6 f, i) c$ A  I                else& X' ~2 j) U' k2 }/ ?& K
                {
4 v) m7 q/ h: K% a3 Y0 C- F                    if (numw[i] != 0)
0 x+ u. j1 _2 F8 Y& g, ]: v                    {
& s8 O, S% I# [7 {0 [/ y/ ]                        i++;
& L7 e$ h% u" \                        k++;
% M; I1 b5 j2 I" I                        if (k == n)4 P1 m6 }" {( x* c9 P9 e
                        {
/ g3 m, p, K4 p7 o& R2 }! ~                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
) H" h' ]/ y8 x% b                            k = 0;
% r6 k0 l  g3 V, l, N4 u              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
- @+ Y6 ~  j2 v8 U                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);8 E5 K; _6 z) T# n& }9 C
                        }
: I. k* r& n) F" V8 d$ H5 j                        else//输出暂时还没有改变数组元素的值
# U, s: w1 ^' U9 q: I! P& H# @                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
/ P3 y8 h! N1 c0 t6 W                    }
3 k) v9 H4 n3 Y9 b  `4 d2 |* [                    else
) x  q/ W. a' n6 A) C                        i++;//数组元素为0,直接跳过,不计数。。。  Q: F7 l, D" S1 D& H" x
                }
4 }5 X5 i& R. S: `! p
: I8 s3 O, u) E) z- H3 d% K( B: w5 F+ i. T0 Z
            }//结束while循环3 I6 \% E. e1 K
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
. t$ R; _/ O8 \% p  }, h           
/ z; p3 s+ j1 H  Q                if (numw[i] != 0)
: H4 d8 g( [3 G; B. h- z                    Console.WriteLine(numw[i]);
$ ?) g+ A- F6 P& s           
. U* K4 s* M% h' p            Console.ReadLine();
% S) s8 a' \6 ]        }
) Y2 {( X3 _/ b. o1 A) R    }
7 {5 a$ E/ k& d}0 R+ X" `0 D! W7 l) ^
小甲鱼最新课程 -> 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-21 18:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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