鱼C论坛

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

猴子问题

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

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

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

x
大家好!" W8 A) J6 b! @3 V* @
这几天我在忙着编一个问题,我用了一种方法编出来!
9 _; c; K: l9 z4 W" d但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!& ]* M( H  l; i2 }
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
) K# G2 V) A! C8 G7 M+ d1 y
9 _; l# `9 ?6 _# I+ t$ c8 o
* F/ b' G3 W% n0 Q- ]( _$ ]3 T4 U
                            题目
  t, s! B; u4 c8 p山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
7 g2 L' A) Z6 S' {  z1 S第一种方法:利用循环链表2 y2 ?  Z" Z$ n( O6 y
#include<stdio.h>6 Q/ l5 z/ {/ K) m. `, g
#include<malloc.h>
) d# r( ~; S/ _& u1 z( z#define M 8            //共有8只猴子
, c1 V$ O$ g" _+ K5 K#define N 3            //数到3只时退出第三只
) A$ I( P' i0 X1 U; p, ]typedef struct monkey
4 h; [3 o5 J8 e5 w" R2 q- t4 @: m{int number;
1 U0 z' a* t' v' E- Iint flag;+ q1 w( m  U( e0 ?$ T# p* I
struct monkey* next;
3 N* u  w. m" G. f9 x: q' X}MONKEY;& X( l/ l% b9 P: c
main()
) O9 S  b' w9 T+ g# u% w; \{ MONKEY *head=NULL,*p,*s;
$ i! \) r  ^. C1 [4 {2 K1 G+ R2 _  int i,sum=0,count=0;3 a9 F8 Y5 [" e8 y& ], c( p1 r( A
  clrscr();              //清屏
# z0 V% s. o9 O# ~4 E  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存+ D. y! P* r2 ?. G; Q. p
  p->number=1;p->flag=1;; d9 [  Z; r) ^- `
  p->next=head;% O5 s- r& d2 [" l* J6 Q5 A$ l, x
  head=p;. O2 [$ j& r0 m
  for(i=2;i<=M;i++)$ q1 Y! z4 y  q. ~* _5 G
    { s=(MONKEY *)malloc(sizeof(MONKEY));
$ y0 F" m' h2 y2 G! D0 X  z     s->number=i;s->flag=1;; E1 y8 Y1 K& e# y) }% a1 q6 P/ A% B
     s->next=head;
1 \# [5 |; b. j/ P7 U. q     p->next=s;p=p->next;% b, f& ^1 D0 T* s; @. p( _. W
    }
% C. s% }8 B( h2 J$ d) S/ ^    p=head;% L4 Y/ {4 J  Y) @, y! N
   for(;;)0 I9 v  m* a/ i9 P
    {if(p->flag==1)
- B3 m  g8 s- {' O- M) f" K       count++;6 f: M4 O& _" ^3 i
     if(count==N)
8 p+ \  h: ^& e9 e        {p->flag=0;
  B1 V" |) b; o' d2 @         count=0;
/ O3 i4 s& i& D/ Q         sum++;}
! ~, K- _  r3 e9 U5 d     if(sum==M-1)$ y: a1 s* M  V0 J1 S  ~' e
        break;
1 [) o+ O6 K7 `8 q     p=p->next;
. N7 ?% E" E0 `  z+ l" N+ t    }7 a/ j6 l4 A1 p/ V. D
    p=
  W3 T% ^7 V4 j& q0 ]% y) L    head;" F4 I% U1 s$ p
    for(i=1;i<=M;i++)
4 W3 z2 ?4 A! x0 {5 A" k8 z7 p( C    { if(p->flag==1)
# d: o- p+ |- g) O        printf("\t%d",p->number);
7 C) V) V& Q: L+ \2 f      p=p->next;" B* \* J1 K8 d+ ^6 ?  X! Z5 a
    }, `9 d4 n8 F; Z1 [% v$ t* t
  a0 H# H( w- \" n2 \

; ~5 d& o  o6 S) \. ^8 \6 f
8 h" z/ L" D# O}
( S7 }5 W. {1 P$ E& I5 z
第二种方法:数组
/ O# v% l8 i$ E' _6 y5 C#include<stdio.h>
0 ]3 H. d3 l6 _. R2 C#define M 8( W7 s: i2 V0 E) N. ]
struct monkey) f' e' [, j  P2 |
{int number;
! [1 t0 U+ g  I3 }' Gint nextp;, O2 Z% W9 a, I( T
}link[M+1];6 }* ^$ j1 T) N" U
) p+ A9 W/ S0 ?! P1 j6 r- C$ x4 ?
void main()0 B7 }6 t# G5 S
{int i,count,h;6 z: b$ Y! H9 D0 P+ ^
for(i=1;i<=M;i++)7 e9 u% E  A- E- K+ _. G& B% w% F
{  if(i==M)
' k; v* ~- P' Y  M3 w' V6 E1 \6 k   link[i].nextp=1;
; S9 o& z8 x4 \, }8 E' `1 o   else% Y. }' F7 h, R( V
   link[i].nextp=i+1;! l( c5 F7 E2 f' I4 Q' f
  link[i].number=i;! f) c- k: B% U) |0 ~: R% I
}
) v* ]0 r* \6 o8 _  N$ \4 \6 _9 oprintf("\n");
6 s; R0 V0 W* v, `& P* xcount=0;; V# _5 B3 O: Y% U
h=M;/ k# V7 I& w1 p" ]9 a" b3 e! t
printf("依次退出的猴子: \n");
; `: n. R9 p# A. Bwhile(count<M-1), {9 ]0 b9 Z% P7 z" X
{i=0;1 v1 N3 m5 K8 P  A) X# w" Q
while(i!=3)
9 ]* c% H7 U$ ^# `2 b% [{ h=link[h].nextp;, ~& Y0 w; }4 [* U
   if(link[h].number)
3 l. `, Y8 Q. t5 v, `: L3 `  J" ?( S     i++;}
9 f2 [4 F4 U# H7 U' m9 F0 t2 [9 n( v+ Y1 Q1 f
printf("%4d",link[h].number);
' _( s& t0 d2 ]7 J9 P' y- Blink[h].number=0;
% E  [2 E$ h0 j' n; Z; r3 ]/ xcount++;0 G/ O, p# Y/ _
}* E. ~/ c+ @2 a  C
& @5 t3 s7 c' d$ |$ V) m
printf("\n大王是:");
8 J5 I$ S! P/ T: C/ `6 N3 O" a* e  for(i=1;i<=M;i++)
& c8 d  O( e8 P  N( ^  if(link[i].number)
5 Z# v+ M0 C0 n+ A( a9 p    printf("%3d\n",link[i].number);
2 V0 J) a  }' Y1 _2 [3 ?9 ?0 w
8 n# }9 T) }7 C& X, J, X( S2 \. L' ~' A3 `2 q  o% d& y
}
8 ^. X7 `! E: i4 W. H7 o
第三种是普通方法for循环
1 x0 G5 g% T$ N1 T% {) C  \2 g2 n
#include<stdio.h>, `' Q0 V  J/ Z( y5 C
void main()# \4 u  ?! ]  }& e" V
{ int i,k,m,n,num[50],q,*p;
) y; X: x/ M; t# @' n    clrscr();
+ V6 E' e% \/ o2 Y" H2 ?   printf("input number of person: n=");
$ G$ x5 E) m2 V4 y! v    scanf("%d",&n);' D  w2 S! K7 B& P
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
0 s) Y1 }- i% l    scanf("%d",&q);
# @2 [& n& r! o8 @0 w0 @   p=num;
( v8 _3 K- |5 _7 t0 |4 s  for(i=0;i<n;i++)
. {6 m0 \0 G( C    *(p+i)=i+1;" G: L8 S5 j5 k6 h: |
   i=0;1 Z  J3 B9 f; B' C+ ?% l
   k=0;3 |) H+ H% {; Z2 u
   m=0;% Q5 P/ F6 i$ E2 r& s
  while(m<n-1)5 n. X" s+ I- p
   {if(*(p+i)!=0) k++;
& K/ F) F" b9 g& |     if(k==q)4 |; C2 T; s2 j! w* v2 L9 ?
      { *(p+i)=0;
9 n$ n+ j5 f+ w        k=0;
0 [& n  m) W) o% K/ S+ g' x8 y        m++;- y& P! l! c- D: n8 \
      }/ m, ?1 o( H( B" y7 t% S
    i++;: v8 s7 e% H' V% P
    if(i==n)i=0;5 f0 m0 W; V( b8 Y" @2 n7 h3 v
   }' W/ O  g: V* k* n3 L! G
  while(*p==0)p++;
' M- G0 B! e" s7 k    printf("The last one is NO:%d\n",*p);$ m3 z$ i, h9 W! A4 }7 T  }; h
     getch();# K/ B4 A$ w3 _* ^
5 }" C9 B5 w1 U" l$ V
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;* z% o5 w8 ^6 C
namespace 又费马达又费电2 X9 u9 a; ]2 F( I( C% M6 S
{
0 T  k3 W5 }- J    class Program# ]. D2 J% K  K, T3 m* u. E
    {3 H* s6 `' s: E3 D- u* A
        static void Main(string[] args)
; s. X5 T, A' ]# o        {
+ I6 [. X) H2 }( D5 H) x" N  L1 t' v            int m, n;& w: G1 }3 M: ]4 C
            Console.WriteLine("请输入数组长度");
3 m/ Z6 y( O" E4 H& a# Q            m = int.Parse(Console.ReadLine());//m为数组的大小
7 h1 L5 C8 t5 B2 K8 b2 K            Console.WriteLine("请输入要截取数字的大小");) D; {9 h6 K: u" t
            n = int.Parse(Console.ReadLine());# E3 F6 L2 |2 o( T# {. q! Q
            int [] numw=new int
- _5 B2 H, S1 u  K) s
' o) Z! {# T; [0 n2 R&shy;&shy;&shy;;% B' y; t+ }- y- @8 F1 k) B
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数& M$ V; s9 C4 x- v. V& \3 ]4 B: g- h
            {9 ^7 V$ R1 d7 V6 @
                numw[j - 1] = j;
6 ?3 Y6 A1 Y$ C4 p            }
5 R, U- d2 V. S8 I4 N            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
3 R  C/ r: U* N0 n' s0 q; k# v            while (d != m - 1)4 l6 `! q0 }& j8 [, M7 b
            {
! {8 {: F9 K5 N2 m                if (i == m && d != m - 1)" _- T0 g  H, E; {9 w' n2 d
                {1 w" \. V0 g! g0 b: F
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!1 m  x) C. _8 ^% s
                    continue;
( V; c: w! g0 w* ^* @" v! @+ [4 o) Q                }
, u* v& j* P5 H5 d  R, ^                else7 g( X; H1 g. N( U$ S* P7 K* Z
                {+ D$ C* J$ U7 \1 p  f. c+ {
                    if (numw[i] != 0)9 h- o$ O& K, U7 O: ?( w
                    {- |5 d3 p, |) ?* D  R1 z
                        i++;) p( D. n$ y$ S/ ~( F6 G
                        k++;
. y9 }5 T$ [/ g5 r" G! p. T# x! s                        if (k == n)+ R5 c5 V3 U5 x; y. {' c
                        {
3 t: W+ l) n- t' W' ]# J8 O2 @                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
: e8 `8 B/ V$ y9 b                            k = 0;
+ x- M8 }6 L: O& \2 F0 C3 H. [              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
3 J1 e3 \4 Z* C                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
2 @5 G- J4 E/ s; C                        }
8 I6 z" R, h) ~8 |( s) j                        else//输出暂时还没有改变数组元素的值7 L( r1 I! ?3 y# D+ k1 |
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);$ J1 n8 s- w$ u
                    }
0 M$ A( S: ~* v! A4 g( T/ h  `                    else
! `+ q& O" _3 `6 [( R% p$ {2 I                        i++;//数组元素为0,直接跳过,不计数。。。
) V& l. J7 @% Q+ Q- p6 o                }
0 S: X, k, j3 U " [. v: `+ c, s4 ^3 T" n2 L

! Z% q8 l4 y, |* |2 `. I1 ?            }//结束while循环
4 d2 O& l* Z* ~% h            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
7 Y* v8 u2 _5 I- u, i$ T' \7 Y           
$ m8 R: {6 l) X                if (numw[i] != 0)
' G( j4 g0 f; p                    Console.WriteLine(numw[i]);" D; x( Z8 H9 I) ]" y4 U, x1 q1 G
           
' n  O% A+ c/ A4 y! D' V            Console.ReadLine();* C- [7 B/ g" G( h
        }& M- ]$ {: |# Y0 ?" \( O
    }5 C4 X; q$ ~" l1 c/ ?! W. K
}
+ I7 m8 ~* r0 E" q. i4 v
小甲鱼最新课程 -> 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-7-8 15:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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