鱼C论坛

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

猴子问题

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

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

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

x
大家好!
1 Y7 U. L# r3 T, m( y这几天我在忙着编一个问题,我用了一种方法编出来!
- N) V' L0 F/ T' F但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
3 h3 P0 h" K7 M注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
$ ?2 I  ]0 E; {* \3 n
8 n' h" \( i+ r6 M
6 a9 }( N; m1 n  g
                            题目
4 H& j- Z# j7 D, G  z9 B山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
9 y4 V( \: W$ L5 a& ~第一种方法:利用循环链表
0 I7 `( J" `. T, v4 t7 h4 Y#include<stdio.h>" j8 k( \3 Z7 ]3 p
#include<malloc.h>
; M( V0 B4 W/ O6 ~7 f% v#define M 8            //共有8只猴子
0 g) u$ `+ |6 }2 j#define N 3            //数到3只时退出第三只
8 Y7 C9 l; y9 O! U. T; Atypedef struct monkey
9 n/ I# W8 i( D% M{int number;% X+ B1 l: K2 @( i) u
int flag;  S& J& o0 N5 n- `% `! l
struct monkey* next;
1 X. l3 K- X/ H2 S' D5 B}MONKEY;
% e# {4 P! r+ {) T2 ?: i) H' H# imain()
& X) r/ Z/ i- G{ MONKEY *head=NULL,*p,*s;/ |& q, _1 K' p5 n4 M
  int i,sum=0,count=0;1 q5 b9 r2 y3 h. ^: |' [5 E. b: [
  clrscr();              //清屏+ ?1 R: d; \% |, m
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
. o+ p$ R3 y! h! I0 s# F% `: J  p->number=1;p->flag=1;
* Z4 W4 U# a( N9 c/ E% T. ~- c  p->next=head;- V1 m& \; M% g
  head=p;$ t; k3 l& y  W' ?, m3 K
  for(i=2;i<=M;i++)
1 l# B+ ]  _, D: V0 M    { s=(MONKEY *)malloc(sizeof(MONKEY));
* N  `* B6 M4 d! |; ]. {     s->number=i;s->flag=1;- b* {( ~1 I: ?6 b" m
     s->next=head;+ {2 Q0 \) Q! R7 ^  v: ]2 h  y
     p->next=s;p=p->next;
# C/ v% T; d- k    }2 c6 B0 O' h. v0 e* h" C+ Q/ ^
    p=head;4 F  ^/ h7 P5 d7 W1 X7 N
   for(;;)
  ?' G8 K; }& K/ S    {if(p->flag==1)6 p( k( N6 Q, @$ \  T
       count++;" J4 F( t9 v' |) M- M4 ~
     if(count==N); Y3 H% Y7 Z9 L1 g: R. G& t
        {p->flag=0;
. m" w% ~- P1 V, O* s. P/ y9 I         count=0;/ K0 H+ @6 u+ ~& s% c" W/ w( x/ k
         sum++;}
' V/ q3 w/ X" c" \: s1 b     if(sum==M-1)$ b: K4 r, ~& u1 j% Z7 u/ \
        break;. z) K: d$ e7 j, S
     p=p->next;" Z3 D1 G8 w4 |/ l, A, r, M
    }7 v! W& g+ e# J6 k% ]
    p=3 v" @  e- a( [& q
    head;
. ~; v* T: h& n) @- D, @, O    for(i=1;i<=M;i++)
2 H  l3 [# q9 o2 T# B    { if(p->flag==1)% Y2 m& i1 x7 c7 A% r
        printf("\t%d",p->number);
; t3 i+ W/ [1 O/ [      p=p->next;
* O1 Q7 O' P, ^) j3 y7 {    }
: j2 K& v$ R: Q4 q+ Q2 m& W  E9 O2 H! g% ~4 t5 z

5 ?- M" [- ~1 o9 ]
2 Q6 ^' O# l3 \' u0 Q}
& D% ^% y) K$ p/ l# b. p% t+ N
第二种方法:数组
% ?' Q7 u6 j: I9 c#include<stdio.h>, [0 i: Z/ m" o$ j$ f
#define M 8) d/ ~" B( v& m1 m1 S7 l! {
struct monkey4 f( a" P2 q6 L3 {# o6 v
{int number;! |" E  B9 C+ h
int nextp;
: r; e; R6 }4 T9 A1 m- ]4 @( a}link[M+1];
' `4 T9 {* L7 A. T: E
" z2 f" |+ @& cvoid main()( u, K; J0 F# M+ P- j, {8 J
{int i,count,h;
  \' k1 b9 V. d2 kfor(i=1;i<=M;i++); k# i3 w$ I: c! j7 t9 x* |
{  if(i==M): k' d1 o2 d) Q. R
   link[i].nextp=1;; O8 z- e6 G" ?1 y/ C8 n
   else5 u& N' f! W$ Y0 D" @) ~7 @
   link[i].nextp=i+1;
5 s% F8 M# p, W5 j/ U  link[i].number=i;$ x$ V1 M& {: u8 t
}
; _! @4 P6 `; ]3 V0 O2 z5 p" Tprintf("\n");
3 d9 ^4 I9 S) Y, i  a9 B6 C; acount=0;
1 {& _2 ^: S, v3 D) C' @7 Ah=M;4 V( y, q6 s: k" U2 O6 L, B- @1 F$ t
printf("依次退出的猴子: \n");
3 V# W& \/ K- |0 A7 ], Nwhile(count<M-1)# o3 K, k9 D- [. y$ C' a9 {
{i=0;+ H' _$ `: R! i
while(i!=3)% `2 ^% L3 w& u7 z+ L4 u
{ h=link[h].nextp;( Y) z  S! o  Q! Y5 T  P
   if(link[h].number)
2 h" i+ A5 S0 P" q3 ?     i++;}9 L- n7 R( v0 G: _: h; F0 C
+ e4 c5 l. `! c! w3 F
printf("%4d",link[h].number);: r6 N8 i+ P5 H! Z$ E
link[h].number=0;1 T0 f) a# T  ~, l% L
count++;: l+ K6 Z- ^3 a
}
9 q" S  H0 C( w9 R5 }4 Y
, y4 l$ r1 e* Lprintf("\n大王是:");
" D1 B9 P) s) X5 y% Q  for(i=1;i<=M;i++)& h/ G( F( {/ [
  if(link[i].number)
$ q7 L" m' A. L: J    printf("%3d\n",link[i].number);5 |; c/ L! d/ H/ ~/ \/ U+ I  Z/ p
- d8 v  x7 `4 `1 Z; D

5 n- a: D/ b! Y1 _8 @6 b' e}
6 P* F9 I: k+ f) d
第三种是普通方法for循环

6 j$ h/ a8 F4 L#include<stdio.h># a9 ~% e7 B0 N/ B
void main()
: H' b* N; U) [% _& ?( u% e; e+ x{ int i,k,m,n,num[50],q,*p;5 e. T: C! E5 z! j' b& P* ]
    clrscr();
2 Y1 a' d3 \* X5 W. p   printf("input number of person: n=");% C* ?/ d# D: l$ H* G  H
    scanf("%d",&n);: ?' o2 w& |/ t3 C+ d/ g
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
3 o$ |* k0 q, k5 U    scanf("%d",&q);+ J" V2 I$ i0 i3 {1 S, H6 P
   p=num;" _5 X' l1 f) m: h0 q$ E! b+ Y; c
  for(i=0;i<n;i++)
7 W/ g5 K* ~% e; d& x    *(p+i)=i+1;7 ]6 _% j( m$ g. _+ Q) J4 {
   i=0;
% J" u! h% z, Q3 ]   k=0;
& X4 ]8 n! f& \  Z9 n   m=0;
& j$ I2 n* f( Z' t/ _' t$ o  while(m<n-1)1 Y4 L0 ?$ m; {
   {if(*(p+i)!=0) k++;
0 H! N6 u9 C' w% Y3 j     if(k==q)
8 Q1 ^+ h2 C2 G( |9 `. B+ D, C      { *(p+i)=0;
1 ~: U, `  j. _) S        k=0;
3 R$ A. E& g4 o; k, H: Z+ r        m++;% o# e  T3 ~3 D% V
      }
; P7 z" i2 q7 k3 r7 [    i++;4 j7 V# b. ]2 h7 }( t) a
    if(i==n)i=0;8 s8 j# m) i9 }: ^& J- ], o; A/ @; a8 }
   }
1 H) h4 K4 z7 z  [8 a9 O" F  while(*p==0)p++;; d8 i7 [  D- X  n* Z6 K
    printf("The last one is NO:%d\n",*p);$ m3 K0 h: W+ D" y9 O0 K0 i7 L
     getch();% u0 ]' l) Y" l6 r0 Y

# j1 N" A! v9 r. m  n5 [7 L+ p0 H}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
( o; q4 [; Z# [4 W4 {3 R. lnamespace 又费马达又费电0 [: C: f; f! W; C
{
0 i  {8 r) y7 Y# i( [0 G    class Program* G* {; X+ c% y# I
    {
4 A! W; g5 q6 @0 \( B5 T4 I        static void Main(string[] args)
, I2 n" T6 k) V( [9 q        {' H; |4 [8 Q* p% G2 E6 \; a. x
            int m, n;
/ h' l/ Y+ W0 P5 e! {$ Q            Console.WriteLine("请输入数组长度");# Y9 L! S" s  J+ V% W
            m = int.Parse(Console.ReadLine());//m为数组的大小
2 n& s8 k6 ~7 @8 A            Console.WriteLine("请输入要截取数字的大小");
* X4 O1 s1 l0 f& e8 u, J$ V# K            n = int.Parse(Console.ReadLine());
' x" q6 S7 l. _1 h3 Z/ N            int [] numw=new int
5 x" {2 q. @# Y2 A) I/ L7 I* |+ d9 U" i: |
&shy;&shy;&shy;;
' ?( N* D, T3 a- `: m/ g            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数2 o  J" w/ N& |9 \* ~0 G$ L
            {" j' l9 }' U5 y
                numw[j - 1] = j;, {# a$ x( E% @" Y1 ~! B) Z+ c
            }- C0 s$ p* ]3 c0 l
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
( z) ?) q* T# S  l            while (d != m - 1)
& n( Q/ _/ Z! O/ s. K: }3 p  U            {9 o& ~1 O* g4 s4 ~8 M3 \
                if (i == m && d != m - 1)+ i, U, T) s# C6 l3 t: [
                {
$ V3 o$ D1 i9 h. w2 H. h                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
. y& s5 B2 f6 ^2 s& ~" L                    continue;
% Q+ n5 D  ~/ s. p                }
- Q5 f2 H. M/ P                else1 s7 m+ B% E! D! R
                {: r- B8 {" l4 `
                    if (numw[i] != 0); W  g" u/ o3 w/ ]- x! S
                    {1 V6 Z- A1 o8 b
                        i++;% \) ~; s6 D1 \
                        k++;+ t! B3 Z) x- o- w
                        if (k == n)
3 M% ]3 c2 u: A4 L5 f2 j7 \                        {) [, x  \! _% s" g- [
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
1 S, g; |1 b* ^* Q( e9 c; Q                            k = 0;
/ n# Y: z/ H& [9 F4 l, ~              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
6 b6 v4 \3 c, t                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);, i$ N4 U7 \$ _! B# v/ ]: W5 K: z
                        }) V+ l9 R; c5 @
                        else//输出暂时还没有改变数组元素的值
2 i  F- ~+ B, T) O                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
+ b4 V# z7 B7 r3 _                    }) x7 ?, _8 v5 {
                    else& E& I# ^! B' N4 N
                        i++;//数组元素为0,直接跳过,不计数。。。
8 t; z$ P8 _' M5 t: f                }
( V! O& v0 F- h  x% H- m$ w; V ' v, ]9 Q8 N1 ?3 x# L' u
( X$ j) @5 W- Z/ C4 g
            }//结束while循环
3 O1 `0 u$ A2 |            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦+ I  @' ^5 a9 T' E
           9 Q1 m; T# |2 M
                if (numw[i] != 0)$ o9 v( r! W. K& J. r$ s
                    Console.WriteLine(numw[i]);8 f6 r4 \" h: Z6 S7 v7 c
           
  ]% S4 c" F2 ?# W' `$ ?5 b! m            Console.ReadLine();$ j7 }8 T- M' e# q) `+ Z
        }0 P2 c0 E+ y; B$ V: s& S1 `1 J. ?
    }2 ?7 ]! L# k/ T! o4 [% V1 `
}
& X9 r) ^' K7 O. W- V
想知道小甲鱼最近在做啥?请访问 -> 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-11-23 01:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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