鱼C论坛

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

猴子问题

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

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

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

x
大家好!
9 S9 G7 G1 D& g9 l这几天我在忙着编一个问题,我用了一种方法编出来!! L' _0 x3 k/ X- U- S$ y
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
5 X- P0 C8 R. J# q8 A注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
& C. [$ j8 z' E& Q6 X" d- N
8 B2 ]; J0 @- a# _, s
% ]7 c, j) o$ O3 d, W+ h4 v" ]
                            题目: V, v' }: _  Z; k
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。" G6 }# H) B) e+ r! e
第一种方法:利用循环链表
( l; L. L: M% Z2 k' |) m1 |* b#include<stdio.h>
# p7 G2 X2 F: L2 q4 k2 E6 y. o) \#include<malloc.h>4 @; y+ n6 e; ]! M& R
#define M 8            //共有8只猴子+ [  R0 p; B' N3 Y, i
#define N 3            //数到3只时退出第三只6 {3 T9 q; \, q7 H5 B, {
typedef struct monkey
, D! o  ~0 w8 d4 A{int number;1 w0 t3 R  M6 K3 z) x) O
int flag;2 r" C3 w% {) D* _3 a9 n# n
struct monkey* next;0 F  `5 j) o& F" z6 R, m
}MONKEY;: f% D& m5 ?' M& i
main(), M) G% U% m# K, C6 K3 J
{ MONKEY *head=NULL,*p,*s;
& d( w  c; h3 z2 \" Y' {2 t! S3 o( p  int i,sum=0,count=0;! A0 h- S( d. N7 a
  clrscr();              //清屏
- p3 W* m% Q  y& J% V; t  @( Q0 v  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存2 j$ a% D" z  C3 _
  p->number=1;p->flag=1;" D1 T1 ?% ~7 q  R5 V$ a' U: |' M
  p->next=head;
0 K1 ~. |, A0 W$ `+ A3 O  head=p;1 ^! O+ ^- {/ x& o: h1 w- `1 `  Z, q& H( b
  for(i=2;i<=M;i++)
4 ?  o: `% i/ B) ^) j& r" Z2 }' ]    { s=(MONKEY *)malloc(sizeof(MONKEY));
; y- ^. H% g1 p0 y; z- i     s->number=i;s->flag=1;5 I1 ^8 j0 v" R" x+ ~! y
     s->next=head;) w5 n! G6 J4 S$ Y
     p->next=s;p=p->next;
- s; _2 T0 t3 R) R$ B0 w    }7 V0 K4 F) ?2 A3 x
    p=head;, y/ E  Q) l0 G) i8 ^  X
   for(;;), Q$ o! o' `" e6 l* C1 d. i# ]
    {if(p->flag==1)/ ]/ A* ]0 z. @
       count++;0 E$ ^5 `( r4 V; p
     if(count==N)0 I+ m1 I8 @* {2 f9 E% S6 _
        {p->flag=0;! q4 H! e" _: b* ~1 p- n
         count=0;
8 P% s$ q& |5 [8 Y- |         sum++;}
2 W3 l! D% V& w* C. x) n     if(sum==M-1)
1 a$ r0 {/ a7 J' f        break;3 T/ _& o- f& U$ h) N+ g
     p=p->next;
1 V+ X! d: ]  `! f+ T7 v    }0 Y& m* _. C4 z
    p=4 l; Y  n$ N+ V& h7 r3 a
    head;
: N& t& C  J- V; W0 {' [    for(i=1;i<=M;i++)
3 y$ `) t" O6 H8 c4 e    { if(p->flag==1)
  P% E5 D) m8 }        printf("\t%d",p->number);
+ B. T& N* T- [: h! i4 I' r      p=p->next;" z( r2 s  _! v( z5 M4 A, }
    }
2 W& L* L) }( w% u6 _; |$ I2 N- H  K4 z% l3 Q& ~$ ~
5 h* [% g9 g' Z1 G& s) m. ~" ]. w

3 j* e' y  ~$ g4 g3 Y# ]) S7 L& l}

9 D' E4 B7 Q+ g: }1 n5 i第二种方法:数组9 J9 p# B8 h6 f" M
#include<stdio.h>
. z! y! u% z; ]* S! H#define M 8
6 ^; I/ i6 i& [& u1 G5 N0 kstruct monkey
) ?; L7 e/ ?, x{int number;
; w. \, Z7 Z3 Q' s' H3 v  t, nint nextp;
0 g' `6 P  D2 r9 [/ U+ i}link[M+1];
) \. `/ L; M7 B/ f: J3 I2 I) q( z0 k) n/ `; v4 m, O
void main(). \# }8 x5 x0 ~
{int i,count,h;
4 ?/ l- t0 c3 S" Z" Lfor(i=1;i<=M;i++)
5 B7 ^& z9 D- W{  if(i==M)
5 W" A: |" V) I4 x" d9 H   link[i].nextp=1;1 s0 @/ H- |4 {2 s3 D
   else: Z" W0 j9 Q- |, P# W& H
   link[i].nextp=i+1;
$ ]- J. Z5 d5 p% r% F  link[i].number=i;
; ^7 w  a) O. U6 e7 G" J}
3 Y1 x' {4 R  N) g3 y) {, tprintf("\n");
& _) k# B5 z, Fcount=0;
' J; `& P: q; d- Fh=M;" t* W, ^! C( f) v$ }2 K
printf("依次退出的猴子: \n");
" E, R* ]* u0 ~% V2 m  N2 ^while(count<M-1)
4 f+ u6 [: A. q) p# P4 W2 f) K{i=0;5 P1 w& f1 V$ O$ V) t; x" \& ?8 h
while(i!=3)
9 D+ s) _+ E+ j8 P- {{ h=link[h].nextp;
. Z! x; D( w& O   if(link[h].number)
7 U+ v$ M! X8 ?- U     i++;}
' S  c$ t. q0 G8 D' c' T
2 [$ P3 d9 |' {* X- b; N& Zprintf("%4d",link[h].number);
4 ^5 X0 _* t: Q4 A: vlink[h].number=0;
% t4 D) l3 H' v) W9 r  y7 rcount++;
- _  {4 E7 a5 i7 K) V}0 I! R0 g- ^, ~( k. Y

" S6 E6 h3 Z2 z- qprintf("\n大王是:");6 j8 r$ M0 F: A. c
  for(i=1;i<=M;i++)3 @$ e. T6 y* d# |8 T& T& [
  if(link[i].number)5 v& d, i  M7 z, }9 E1 F, t! E
    printf("%3d\n",link[i].number);1 A  A+ N3 A* M6 X8 Z% I6 H
, n5 ~: b' r% Y, T

1 m$ `+ q4 [8 g( V  n: B7 }}
. f% Z4 h  Y1 n. s1 N. \
第三种是普通方法for循环
: f- f3 I6 x* @: G) Q8 d7 ^6 n' R! C
#include<stdio.h>
2 ~: n: u# M# g2 J) Pvoid main()
8 V- f, v( }( a$ W1 U# m{ int i,k,m,n,num[50],q,*p;7 e7 E) u* V' N. S
    clrscr();& l9 c$ s4 C7 J) Z
   printf("input number of person: n=");4 U" y4 G" I+ p- E: j0 L
    scanf("%d",&n);  |5 N* Y  A: R8 a0 |& z/ ^
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
: _. j" I1 f# L/ i( H% F    scanf("%d",&q);5 ?  s) ?5 e. v# y
   p=num;
& i+ P* F" D& C$ W4 i  for(i=0;i<n;i++)( c4 V/ L- q6 |/ r
    *(p+i)=i+1;
/ c1 z  r9 t5 d( T* R+ a5 w6 J   i=0;
0 ?+ h0 j0 y( j& j" y( O* ?   k=0;$ ]8 |* M- {" G/ O5 ?, k# S: \
   m=0;1 S3 e. m4 ?8 a# c' [  \
  while(m<n-1)
  h! G1 |+ h; |. w) X1 f! o   {if(*(p+i)!=0) k++;
  H: \6 a% q, u2 y9 V     if(k==q)# C2 j. B" W$ X' t  X: S! c" M
      { *(p+i)=0;# q/ T( z$ ]0 P' Z! U/ M7 |( x6 _
        k=0;( M& \# G1 q: \8 q$ W
        m++;
, y4 A) [; Y; g, x& C3 C) a0 F8 I& k      }
  l) V8 L& Y, }    i++;: Q6 \2 K9 x2 a  h+ e0 A% d
    if(i==n)i=0;
& F6 U6 U  g* }* G4 L% G7 `. w( s   }
) y+ |0 d! a1 _; F8 |) Q, Z  while(*p==0)p++;
5 a6 b# U/ J3 [2 O; G. `    printf("The last one is NO:%d\n",*p);
0 M" W, D7 S+ s6 `9 T     getch();
2 p1 {7 _  ]5 ?5 }6 q! j$ e. I( F& M% a. s
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;  l6 a5 I! p# g$ B) F
namespace 又费马达又费电3 M. Y" F% c! ?( w5 k0 }& B
{
: \; v5 j9 ?7 m# H& e, X    class Program) _8 X" A- j5 a! C
    {
1 w7 D/ a. M( t9 O0 J# |' r; S* k        static void Main(string[] args)
( t2 l3 P( V  W, z        {
7 e# V( y+ i; Y! z            int m, n;
7 j" ~9 C, Y+ Z+ R) \) c1 R            Console.WriteLine("请输入数组长度");
! e$ c: E5 m, H2 b            m = int.Parse(Console.ReadLine());//m为数组的大小) M9 R2 B* F4 _* I# u! z/ ~
            Console.WriteLine("请输入要截取数字的大小");9 ~/ k0 w3 @" A4 d+ f: H* a" ?
            n = int.Parse(Console.ReadLine());. t5 C$ \3 n8 V: t
            int [] numw=new int9 z/ j4 C8 K& R) Z

% C3 e* K6 j' p. {+ k' Z$ t+ o) [' Y&shy;&shy;&shy;;2 k: q1 j/ ]8 D4 j! ^; j$ Z/ j9 |
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数2 ^/ ?3 G5 [; b) D8 t$ z# T: Y
            {, T7 N5 N* S! q6 M2 q
                numw[j - 1] = j;8 @) r. x& i* l  s
            }1 e. ]8 }" \" S" a9 Q2 d2 B
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
3 b9 X  n* i* H: b3 ]0 d. F+ \            while (d != m - 1)5 \% z+ m% _/ H, D- S
            {3 R1 s/ _% j7 x8 c7 h+ t
                if (i == m && d != m - 1)# ~% I8 \8 H6 x% X: }
                {
. u8 q( g$ B( l7 x- G3 W$ X                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
& S# n" V- B6 v0 D4 q                    continue;4 b2 L* H6 X8 ]. U
                }
- A- A2 T. N! C- w* z  V, W                else
% I' q) M3 ^' ?! V' t9 i( H3 e                {) Z3 q6 E; j! d# A
                    if (numw[i] != 0)4 i/ X/ H* [& V8 c0 d
                    {
3 K& Q. U4 N1 }, W                        i++;" @, r! I- [0 n5 c( F
                        k++;
) G0 N! u' b( k                        if (k == n)
9 _" H  K9 p- a' [) v# X                        {
& a3 t0 a3 k* r( ^- B1 U6 D                            numw[i - 1] = 0;//把在n位置数组元素的值改变了4 \6 Q6 I8 d( w8 O7 f+ h, C7 a( O# v# l
                            k = 0;; |! Z) k  v0 C4 p" L# d
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1, U: t$ h$ F7 b- M+ o
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);7 B8 f; `/ I) w
                        }
9 T1 Z# u3 }0 b* e                        else//输出暂时还没有改变数组元素的值
, G5 \, S; l1 a  Q, e6 V                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);7 ^1 f8 P; G# q, f; y5 f5 I1 }* F
                    }* R% F# t/ {7 K& g+ w5 F$ P
                    else; ?+ s- O$ g9 O$ o
                        i++;//数组元素为0,直接跳过,不计数。。。4 @' X% x$ w' l% l6 Z( u7 Y; s
                }
& J( r( Q# @3 C* {9 d ' j1 S( b8 U) F; B- R' O
# K+ f: o8 [# j
            }//结束while循环
, G) y& k3 p9 l+ D. X            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
& A* `0 J- O/ N8 @. D/ |' ~           : W2 @# }( I) t. E6 D
                if (numw[i] != 0)6 ~3 @% }1 g5 d8 ?+ [% E) N7 T
                    Console.WriteLine(numw[i]);3 Y: p2 m9 U3 y- A+ q( S" D1 K- K
             A3 b! U6 L/ n. J/ Z2 q  [1 |
            Console.ReadLine();
* l; p* `; ?% k0 J        }
0 D' x) g. N2 T    }9 F! ]9 n  x; v  `; D& J9 y3 n
}$ O) m1 ]6 j$ V+ W5 b
小甲鱼最新课程 -> 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-2-17 14:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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