鱼C论坛

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

猴子问题

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

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

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

x
大家好!* a- [' `( O( `* Y: @
这几天我在忙着编一个问题,我用了一种方法编出来!- Z. T( m2 x  a# P& j
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!3 f4 w7 x- E% |! I5 \9 p, R- g( G0 G
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
* W: H& n2 v+ s% l
6 k5 U5 {5 w3 d* K
3 Y. |3 m" A% C7 u: ], @4 K
                            题目
/ ^# X, ^9 N9 y& S+ H, _山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
, D2 c1 w4 Q4 M9 a# O5 O4 i第一种方法:利用循环链表
( p1 J/ R8 j" F5 v#include<stdio.h>
; I! z! d% p" K#include<malloc.h>
  _% ?/ Z9 B0 h  K, X) w; z% _#define M 8            //共有8只猴子8 m% @% g+ Z" z% k& C
#define N 3            //数到3只时退出第三只4 u/ M& \6 [$ c& o
typedef struct monkey1 d' y% G' p- b+ U( @
{int number;, {" v2 y% K, Q1 Q; r* C, l( Q
int flag;
3 U- V6 G( z. F# {6 i& ~9 jstruct monkey* next;& m1 D+ E4 C7 c* L2 R
}MONKEY;
) r5 e4 ~1 G" J) gmain()2 S1 W; ]* \$ ~
{ MONKEY *head=NULL,*p,*s;3 v3 i. ^+ w4 J7 Q, g
  int i,sum=0,count=0;0 J/ q1 D6 g& M6 {3 P
  clrscr();              //清屏$ _: n! @  k) b! f9 E# n
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
7 E; b7 l" r) l1 v5 ~3 H2 e  p->number=1;p->flag=1;
$ h1 V, j) n# R# M  p->next=head;
6 y' K, U# C" p  head=p;
, A: |* \% f5 c! T( I  l- A" S  for(i=2;i<=M;i++)
! h& Z3 k  m5 G: O( q% a( h/ K) m    { s=(MONKEY *)malloc(sizeof(MONKEY));
' y" i' l5 ~- X8 A; w     s->number=i;s->flag=1;
1 j& g+ S" g5 j+ M9 r+ v. U  g9 o( R% X$ O     s->next=head;2 @$ H  v0 D' x6 y5 f
     p->next=s;p=p->next;4 r6 Z0 f; C/ C' C* G3 r
    }% f; F- G9 X1 n( x3 S
    p=head;7 X% A8 p7 ~  d% t& {) L
   for(;;)
: r: X2 o% J8 e$ Z1 |1 \    {if(p->flag==1)$ X: G/ Q3 O5 p+ f' a
       count++;
7 P" ~9 g. `. w6 b0 p     if(count==N)
# ~5 t$ H" b' |) c9 l. B  y        {p->flag=0;
. z5 ]& F4 \% o) k# i3 M0 Y         count=0;
( s" p% L9 \. D7 f$ C* I7 R         sum++;}
7 p: H& t3 o9 I1 }- u     if(sum==M-1)4 c* X  @$ g8 O  e4 A
        break;
4 C- Q1 x5 y; X7 o0 Z. Q7 G, \3 M     p=p->next;3 i' m$ K& C8 q& Z0 e; ]; X% p
    }
* u* ^. ~8 o. g/ W    p=
2 V* V7 z+ g" ^    head;
8 v& O1 N3 H2 l    for(i=1;i<=M;i++)
" i, f7 O4 W# \7 g    { if(p->flag==1)7 x3 I, N, s0 q1 D* L- A
        printf("\t%d",p->number);( [+ K& w  J2 z! W  T. j8 s
      p=p->next;
7 W+ g- K) ^+ w& u: l) z* d    }  `* i; Y( w7 x

/ H8 G$ w) g& t* u' U: f7 V# x3 b  K; g  g( S

; L3 m5 h( [( l8 J}

5 f. H8 U. F. r( _- z第二种方法:数组
: g; y% ~0 b/ C$ e: L. G+ E3 p0 T6 ]#include<stdio.h>" h0 K& c+ \, ?+ @% t9 X
#define M 8( i# W" F2 ?' D6 r6 s
struct monkey! D+ H6 r/ x2 M# e3 i/ a* O7 Q
{int number;
! a. @! ~3 O$ t- Z" v0 [int nextp;
! u# W  h& O. ]$ U8 \}link[M+1];! k/ S' c; _) k0 D$ L
8 ]- q% p! x+ |4 o8 C2 s& e1 r
void main()
  c8 L. _8 q% X( B{int i,count,h;
" _. A: N0 P) O+ z+ I3 vfor(i=1;i<=M;i++)
+ P6 C, ~7 I! U9 l" [$ I; _+ J* ~{  if(i==M)
. N/ d' B" n. l  V- c+ x6 s5 ?7 k   link.nextp=1;% H- O. V# |8 n' p) U* E8 u
   else7 V% Q0 K3 g- ]7 P3 H0 A* c
   link.nextp=i+1;: x) T  i7 x2 h! u' K' `
  link.number=i;; n! t7 v4 u8 g
}  p2 M! Z( H4 _/ u' d8 W7 E
printf("\n");) c' J0 i; r; \3 H
count=0;
& E  Q) ]. C0 Ah=M;* Y, G; F: V2 P6 c
printf("依次退出的猴子: \n");
5 C. Z# m( d7 N) c' [while(count<M-1)4 {5 [) ?9 f/ b
{i=0;
$ S4 L3 v. J9 x# M6 H  E4 Cwhile(i!=3)9 N8 o; J$ {  Y+ p- d
{ h=link[h].nextp;: I# z. O$ m( B! T% K6 f
   if(link[h].number)
2 s# j. L8 H6 e( p' P9 n; `$ x4 S     i++;}5 V. n7 M0 |5 F. J  W
% _. T9 {' h3 h5 J0 X) G- I
printf("%4d",link[h].number);
3 O! I+ N8 Q! y; Jlink[h].number=0;3 {! I/ Q/ S$ M" @* ?& V& A
count++;
/ [2 g' M% T9 f% l5 D/ n}6 g- u& ?0 y. N' Q3 ]
+ F  P  `: j7 K4 i1 H
printf("\n大王是:");
/ m9 S2 V0 I# ]) i5 l8 j0 c5 y. a  for(i=1;i<=M;i++)
( J# I0 {) k5 C0 q) G  if(link.number)
) ]; h+ ^$ M- U% q& U    printf("%3d\n",link.number);3 D- B2 |- |$ t) b3 N* W

( \0 ]9 ^( P% k: n  S
) }0 d1 [( S* i3 _3 o/ u( J}

" y4 z$ g1 n1 Y) k# j, p- }第三种是普通方法for循环

$ P) o: `# z7 H: {; r#include<stdio.h>
3 a' d# B' I$ Qvoid main()
# W+ ?- ^1 d8 V. m' m{ int i,k,m,n,num[50],q,*p;0 @( Q9 z$ [. k' d/ R
    clrscr();7 j% z4 w4 Q4 `% g6 S5 ]
   printf("input number of person: n=");% ^+ M+ F4 `1 K; r0 _
    scanf("%d",&n);# Y; n& J4 V3 O
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
# V' l5 c' V- q& N$ I7 j2 J    scanf("%d",&q);9 d* v7 Z, ]# c9 o" X
   p=num;
- G) B0 d# S, f  E) P  }  for(i=0;i<n;i++)
. L" {- N) ?6 S. I& z0 X; Q    *(p+i)=i+1;" [. C4 V5 L& _" ], g/ H- W8 B7 Z0 w
   i=0;/ E( e' u: K# s1 _3 B& F9 i8 s
   k=0;0 `6 ^% K+ \, x
   m=0;
# c7 r$ C- E1 N/ j  while(m<n-1)( i/ l1 z( g  X" e4 z9 D, J
   {if(*(p+i)!=0) k++;) ]( X6 Y. j. y8 ~" E6 {
     if(k==q)
7 F) q- g. m3 q8 p8 s8 h2 ]% \" I0 V      { *(p+i)=0;
4 \# w/ Q3 p) U/ `& u5 g        k=0;( W/ |5 H2 Q: J( _9 J
        m++;$ G3 f8 ^: w9 N3 K* E: Y. O& ?- i
      }, x- f) u( N; }" ]* B7 f. O
    i++;
9 k/ V8 Y+ |- M    if(i==n)i=0;. F' U5 A2 L% [3 U, ]
   }
6 v& {- T6 L" f2 P) u  while(*p==0)p++;+ F+ ^* M& m, p  e$ \
    printf("The last one is NO:%d\n",*p);
" M7 N! S/ Q/ k$ u$ N     getch();4 O" r. }7 i, ]# U7 z0 a/ Y
$ s) T8 i% K$ t6 G3 C) D* v
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
3 B- }6 A- J$ t" p; k0 C4 K( Inamespace 又费马达又费电
3 \; k3 d5 L( X2 X$ Q/ @, A{6 T( s( B3 x9 h7 m
    class Program' f: d, e' ~' ?* ~) O
    {
* V# ]+ o/ q6 ]        static void Main(string[] args)$ {, A! Z  E, g4 B$ m
        {
. M) n! A( v- A            int m, n;
0 W# W/ z' _9 o2 M) a! R1 v            Console.WriteLine("请输入数组长度");
; M$ w. w3 L$ k, I' F1 |            m = int.Parse(Console.ReadLine());//m为数组的大小4 A$ X  O7 Q: a- z
            Console.WriteLine("请输入要截取数字的大小");! v$ r! ^9 W& }/ j0 b9 J
            n = int.Parse(Console.ReadLine());2 _7 b0 p5 m2 b/ ]# j* ?: J; g4 x
            int [] numw=new int6 k  y% U, q4 a0 X, \* R3 v
7 G7 g7 k5 f* W  W( g! u- M
&shy;&shy;&shy;;
; u2 C1 I1 I+ e# E) T5 M/ G            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数' D% r3 Q* Z3 i. d
            {
+ j8 w4 _6 v' e8 g" F: E$ C                numw[j - 1] = j;
) _. F3 o* Z$ {1 w; d  `            }
- t' f" u! ]( W& a3 @5 y& E- z: v' l4 o            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!. b% o" I' ^% Z9 _
            while (d != m - 1)
( m: l. q2 ^2 M1 B3 g* ?3 _1 G            {! b3 K. `- t, Y* z( `
                if (i == m && d != m - 1)6 ^8 _; k! d+ m# s2 o, n7 t6 s; A
                {- S7 C/ h; ]8 F# x5 E
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!, h6 D! _$ _- l% y
                    continue;" B- f, U& Q: {% S# ?: f* a) H4 {
                }
9 f" `& f3 f% l! t) j0 _* @! {                else
& E: L7 p, v$ e- r                {
; j: F. T2 B- }% f: l8 h7 F                    if (numw[i] != 0)
- R7 [. s  k$ t" M                    {6 i- r8 E$ M- t8 h# w$ |% n8 `9 K
                        i++;6 c1 P( l, Z! f+ ~
                        k++;  H, i/ t# J/ R' S
                        if (k == n); [; E8 ]6 u+ y3 C2 `
                        {' W/ h/ n4 j8 I5 t' t
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
6 X; J" E+ M9 g! D                            k = 0;3 |" n2 s! Z/ Q( X3 h
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1; Z9 M+ A  w6 V: b' C  F
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
( e5 ]3 g; p: n* O# W                        }# g! p2 V  }3 \
                        else//输出暂时还没有改变数组元素的值
( Q! b: n+ ]% q# V7 E+ |                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);1 r4 @4 \. s  d5 L3 \* V! j5 v8 o
                    }+ m. K0 r& q, I
                    else
3 n' `/ H% f9 k& p                        i++;//数组元素为0,直接跳过,不计数。。。
, j, f$ ~& d5 J) x                }" o" ~' J) e9 a& ^# K
( W8 L8 X# s) F# n, l$ M6 I6 ]% Y4 J
' D  F1 G# @# B9 l5 t# X% m% H# l& l
            }//结束while循环/ V8 }1 W9 z# r/ m+ a/ f+ m+ k4 z
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦! r/ M' t5 j) S# k
             F5 f  y4 W8 ^, ~; Q
                if (numw[i] != 0)" a4 L# J  _( B- N0 O% M4 m
                    Console.WriteLine(numw[i]);7 U) i" a0 x  S8 N0 k
           # j- m4 g7 p# K; z  V6 o, D& |+ K" D% e
            Console.ReadLine();
+ u/ C, J' d/ w& B+ Y        }
  d( V- V6 Z" W5 i7 m' z  D/ U    }
8 Q9 e" {& W1 @7 ]. a2 s( [}
! ]- s# ^! t' q1 S
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-28 07:02:23 | 显示全部楼层
循环队列。循环链表。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-28 07:02:46 | 显示全部楼层
这个题目就是经典的约瑟夫环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-12 17:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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