鱼C论坛

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

猴子问题

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

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

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

x
大家好!
+ Z$ ]# j2 b& G, x7 T这几天我在忙着编一个问题,我用了一种方法编出来!
; Z- a  W* ?# }但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
- N5 v+ o- x6 J: H) q注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
! X4 M. o& R, w6 h  q# c. J
- E+ v$ h2 q$ D# D2 I# r6 ^
" F8 \8 D0 Q& b1 F, p
                            题目
+ Z4 O- h9 h4 |; Y2 y% C0 \山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
; p5 N: L0 ?  o4 {+ S7 `# d第一种方法:利用循环链表- G+ A0 @0 e, A4 g, U- a; _$ `
#include<stdio.h>1 p( a5 }0 j' e. r9 M7 L3 u
#include<malloc.h>
  r1 p& u- \! x9 j#define M 8            //共有8只猴子
4 N' k' j7 B/ M5 c: t* |$ O9 K- ~#define N 3            //数到3只时退出第三只
* B! t5 O8 ^* C2 ztypedef struct monkey
8 l' w" c* k4 H{int number;
  ^7 L6 `. ^3 A2 }# Dint flag;
6 K( h+ J) |/ v; l4 Z& k$ Pstruct monkey* next;2 s% {% V: _2 `) y7 c" X; R
}MONKEY;
- s0 I0 x1 U4 E# j( ~- E* G5 amain()3 {1 o. Y: s! j& k, ]
{ MONKEY *head=NULL,*p,*s;
3 B( {( ~" v: p' F  int i,sum=0,count=0;& V! e+ V* F) c
  clrscr();              //清屏
. f1 G! ~  i; s2 J  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
0 Z" r) Z' }6 z$ Y4 N) b  p->number=1;p->flag=1;
) o9 y6 c4 B' |/ V% X& {  p->next=head;! o1 y  u# t* n& a9 L2 u
  head=p;  Q+ M5 l2 t3 s
  for(i=2;i<=M;i++)$ `* I8 s- ^$ M
    { s=(MONKEY *)malloc(sizeof(MONKEY));
. D0 w. r2 M  ^8 S     s->number=i;s->flag=1;1 |, S- {3 K* D0 \7 E, x  W
     s->next=head;9 p) T+ `$ A! A
     p->next=s;p=p->next;
" i, h- k" ?# e/ i    }
9 ^" n! i# s8 k* p' H& }) Q    p=head;
* E) o! x$ |9 T  F7 c/ K   for(;;)
5 D1 O7 H% z$ {) q- G    {if(p->flag==1)& k7 b/ T+ m( F2 S
       count++;8 M& f# T3 P& {3 E- ^
     if(count==N)
+ d4 f/ H0 Y& q        {p->flag=0;
2 G8 f+ ?" h. |2 f( c9 p  j# }         count=0;5 G) q% a% c: m; Z( `
         sum++;}
' I+ G' |; H8 ]     if(sum==M-1)
$ i) c6 y) w0 [9 P2 a        break;
* k! K' e' E. \1 D5 r7 k     p=p->next;
% h; A5 X% a# V8 S    }
0 g5 d4 n( {- s    p=4 v( v% Z0 Q) I% T8 W5 [/ c2 e& @
    head;/ I& D5 M( y/ y5 G
    for(i=1;i<=M;i++)2 u2 w. a( {6 n( F! r
    { if(p->flag==1). w& u+ g4 s- N% N& y
        printf("\t%d",p->number);2 H$ Z& R) X# F; Y
      p=p->next;
6 a/ x3 u& X6 c  k/ n    }
& o6 e9 c9 l1 ?# H7 m
$ ^( U0 f2 S, `7 E( C6 o* D7 \. W4 D! f  b) z* I; r
4 _( g/ d# w; l' v
}
+ ]! ]  i; _$ J
第二种方法:数组0 }9 Y# D: {7 ?% T6 [
#include<stdio.h>
' Y& d0 \" w" i6 _8 i- t#define M 8$ l" D, E. Y# Q- S! u) i
struct monkey5 m, f. z4 Z) a* Y/ h0 A
{int number;4 \& V6 ~& e; ]% o- b# Y
int nextp;
+ i6 n, C1 D8 D' D/ V( N}link[M+1];+ u4 C; d2 |9 S* c" M5 P

8 Y# M# C! j) `5 l; L: a. Dvoid main()
* l" p4 }! E/ I( d{int i,count,h;
5 o4 y: d- l6 C1 Qfor(i=1;i<=M;i++)$ O+ _7 O; i' q, f. z2 I
{  if(i==M)' T7 p* m* k7 a" G$ g( _' X
   link[i].nextp=1;
: X+ o+ i$ ^4 N( J4 ]   else8 N+ H7 l( U" {5 _! Q4 ]) X. W$ L! R
   link[i].nextp=i+1;- j/ W# S- j# |( i$ i! j7 ~% z( e: P* {1 O
  link[i].number=i;0 @& J5 ~8 f% S& f/ F
}! y6 U. B& i) O: v
printf("\n");
0 l6 A: F* H0 ucount=0;% \* _3 y4 J1 {" I8 I/ J4 b5 b' g
h=M;
+ Y9 ~( ?- U8 bprintf("依次退出的猴子: \n");
/ P6 m# i% V* U/ E! Y, {8 Y* zwhile(count<M-1)9 w! a) H  f' b  u  t
{i=0;
' @+ d/ M7 s& O7 x0 H# Fwhile(i!=3)% U" M' k$ v9 Q
{ h=link[h].nextp;
3 V8 k( Z( @7 |6 r6 E9 r   if(link[h].number)% |. S# C4 C; h# d: G( v3 t4 S$ j
     i++;}
* D3 f  C( J4 Q% \& x! J  U5 X! F* _! g
' E7 \8 k4 Y- Z" \7 eprintf("%4d",link[h].number);
* J0 `5 j" n  N% W3 Dlink[h].number=0;* P6 S; W$ g* K' a1 c
count++;
: }6 u2 T. s! G- d7 d$ h9 y; [}/ Q! M/ h( f+ S: W

' z( b7 w+ i4 I! Z5 D$ x: k8 m! ]printf("\n大王是:");
, }, \2 D- i$ ~- s( r  for(i=1;i<=M;i++), b3 j# a  V4 O" u; [3 w: U
  if(link[i].number)" i& |3 i% e; }& }7 a+ \
    printf("%3d\n",link[i].number);
9 ?( I: W" c+ {% v
" y4 g- g0 V5 ~4 A3 q% |. @* ?
1 h) O# q8 R" ~0 b* H0 P}
. Y: z. |$ ]& z% Q1 y
第三种是普通方法for循环

+ n+ p' J( W7 g' q#include<stdio.h>9 \$ Z% l; J4 b1 K, L% H: L. ^2 O0 Z
void main(): R$ J  \/ k  }& s
{ int i,k,m,n,num[50],q,*p;0 S$ K, t4 y$ ~9 E
    clrscr();
# o7 o" L0 c$ e4 _( _   printf("input number of person: n=");9 X- a$ r; w/ o3 A
    scanf("%d",&n);# Y& O' ]! \4 i" {# x( J: P3 a
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
% V& H+ g: F  x" U/ m/ N    scanf("%d",&q);. ^# f0 ?! A4 m, g
   p=num;
+ F  g( U: y2 N  for(i=0;i<n;i++)8 x- X8 p( E1 p. \* B( a. |
    *(p+i)=i+1;4 U5 n# _( g/ b6 _) ]1 E
   i=0;0 O4 L8 P# B2 Y
   k=0;9 ~; L' A' k0 x' a( T( o0 }
   m=0;
) B5 q" j6 v, Q& K' N4 ?  while(m<n-1)/ L1 V. }! \9 x/ R+ I/ y
   {if(*(p+i)!=0) k++;9 A2 P# ~  R2 }$ U- x
     if(k==q)
3 E' D9 W1 j; z6 c$ S2 [- u      { *(p+i)=0;
6 K1 z8 I2 o9 ~! y7 ~8 F; \2 N        k=0;
7 e# f8 X$ k" X% |' C9 i" a' _( R        m++;
' |- w/ l+ v  F/ D& }1 g# D      }/ e) K. a# H, ^7 ]# a% ^8 j/ m
    i++;
: H! a$ R# [. z" @1 t1 @    if(i==n)i=0;4 v( s+ S0 `& G$ L
   }6 |% i3 u' t; N9 M5 R! S
  while(*p==0)p++;
" |9 a. c# R$ m2 T, @" U; |    printf("The last one is NO:%d\n",*p);; g# c4 P+ _  J  U
     getch();
8 Z8 j  x" ^5 A1 @9 u* v( I- g* b/ b
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
5 C6 e+ [: G  n& V$ u0 H% P+ cnamespace 又费马达又费电
5 N" l: P3 }4 F+ e# N! X. d; Y( V{
, ^" v1 ]  j6 D& @! M    class Program0 M) {6 ]; ~; q; r
    {( O; N! E6 T+ D) M! u
        static void Main(string[] args)
' P! k% p1 c4 U% }( A        {
7 G& D9 \5 j5 C( K: {1 G2 a            int m, n;7 M* @' |+ B- t  I1 U
            Console.WriteLine("请输入数组长度");" D$ y; w1 _: V4 C  K! Q& _
            m = int.Parse(Console.ReadLine());//m为数组的大小( P4 d' P  M& u" B) d7 V0 Q) x3 M
            Console.WriteLine("请输入要截取数字的大小");+ t, P& `, o9 A) [5 I  G# V
            n = int.Parse(Console.ReadLine());
& a4 a1 k- m4 h3 o            int [] numw=new int
5 t9 I: ^; k& o- I
: ?: s) O1 V1 t8 o2 z&shy;&shy;&shy;;8 a( t( C' z$ w: J! a+ ^& w
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数! {" T4 C- g+ L
            {. P* P' Q0 p& X9 R7 t# U" I1 p
                numw[j - 1] = j;# x0 g. E: @& k3 V# p$ i
            }
& A8 b) o4 b- ?, K+ f: _2 k8 G            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!( J+ M/ r3 f  k6 d. H' K( e
            while (d != m - 1)
1 Z3 h/ C/ A- `9 r' i            {/ `2 ?! c" W4 M" R
                if (i == m && d != m - 1)+ P4 z+ Y: |+ b, g
                {
  ^7 J+ D4 F& Z& m& W                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
* Y/ Q* V4 b# H                    continue;
8 ]: o, a; b$ T# O8 ]/ A                }) j5 n- Q: R8 {8 k
                else4 N5 @/ c& m  h, |6 ]7 |
                {
, T& ?4 q; W% F# n/ C- c- ]: s                    if (numw[i] != 0)
# ?$ F! R# {$ R, `* w* m                    {4 f# h$ C5 U/ w+ W/ }7 d
                        i++;
3 i0 y. m0 @& _+ k( N( |* q                        k++;  d/ S+ K+ s5 A, Q* _) x
                        if (k == n)
! d# n8 S6 Z' e" Q                        {# }$ v( `4 H: s7 j2 `
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
% v# P# }+ U! s" k" _" N                            k = 0;$ |  @1 G& [% \: f
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
! W& }9 l2 c6 h  D6 n' d                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
0 Y+ Q5 A1 S7 F* N0 I3 I                        }
. z* U' j5 q3 E# N( T; V! n- n                        else//输出暂时还没有改变数组元素的值
8 w/ W" e, B" s* t1 W, N                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);) b/ e- g& A0 v  U- j2 G: ]8 W$ c7 I
                    }0 e6 C( t- W. p. g/ d% u
                    else
  ]9 u5 d% N: K0 X+ v3 e                        i++;//数组元素为0,直接跳过,不计数。。。4 L; m: ]8 `, W" {7 x! a
                }
" H" j2 A2 _. W/ v. N* f
- m7 {2 E3 Y8 \' n$ g8 J
& B8 ~4 g5 S' `& \, j6 ?1 `, p            }//结束while循环
+ Q$ W0 f& o5 _            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
, E& F) b4 @( u8 c% N           - B. Y* H# e4 \* }
                if (numw[i] != 0)! L5 S5 j1 y3 `& l, f1 N8 C( E/ X
                    Console.WriteLine(numw[i]);
* D( a7 R% z6 h" o! x$ V           
: k: h7 U+ K" c. p) E# @0 @& \! D            Console.ReadLine();
/ Z, f- n. M- \1 J. c& _& \        }
6 S% l: i6 }) N  \3 K0 i, p3 B9 H    }
2 R" N$ B* u- E; e3 V}
( M5 Q* x  y/ ]% _9 O2 ]; G
想知道小甲鱼最近在做啥?请访问 -> 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-9-21 11:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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