鱼C论坛

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

猴子问题

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

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

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

x
大家好!1 F# A* s" f! `2 F, y' }. s
这几天我在忙着编一个问题,我用了一种方法编出来!
% `! F% u) l( c' e6 u/ Q; {9 ~但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!1 b+ y6 }5 j, \: U8 X' A" t
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
1 [8 E8 c. d+ l3 J) N/ F3 ?
7 ]! p7 v! P* o4 F4 N/ S# B
, d( o- Q7 f; m) [7 C
                            题目
4 V+ E  O) n# p5 X山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。" P/ Q5 C, p$ p
第一种方法:利用循环链表- G; X, F2 c* f) t8 p' S9 T
#include<stdio.h>
  B. w4 g) N5 ~8 z0 y6 U$ L#include<malloc.h>3 m: i# a; \+ S5 ?% N: c
#define M 8            //共有8只猴子2 h2 x& ]8 T+ _8 a' u# W
#define N 3            //数到3只时退出第三只
( m# M- m  l8 u$ Z; R5 H! c4 ctypedef struct monkey% `- `0 A7 H& J# z
{int number;0 J% f% d' B5 r  y/ T5 Y, a
int flag;
9 o: }6 U8 ^. X, Vstruct monkey* next;
9 I% _6 G& ?( _5 u}MONKEY;
# f. h7 T3 E- O* kmain()
5 I8 ~5 @1 V2 G# k$ \% \{ MONKEY *head=NULL,*p,*s;( D- ?8 h$ A9 N4 @
  int i,sum=0,count=0;7 W3 E1 ]' C4 J9 i; O' ~5 s
  clrscr();              //清屏  |) S) j7 g, Z0 |
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存' h. t# }# c- M$ J4 S
  p->number=1;p->flag=1;! m8 |3 F5 W* _% P/ y
  p->next=head;
: Z6 W+ a0 f5 v' R" x, A% Y2 m  head=p;& a- a/ a- y1 b6 r! j% E5 L
  for(i=2;i<=M;i++)
$ B' W7 g) H7 d, C/ z  z. p    { s=(MONKEY *)malloc(sizeof(MONKEY));
, }0 m% v- v+ I' M! @     s->number=i;s->flag=1;" d: k( n# @$ K. I% ?
     s->next=head;
. h3 g4 v& t. @* D% d$ }     p->next=s;p=p->next;! X8 O8 Z  P" z8 p* A2 b
    }
( N% ?9 {4 L' z    p=head;
) s$ m" D& v3 Y* s+ f   for(;;)2 k/ r2 P- N' t) v
    {if(p->flag==1)
1 d; S* e9 j0 b, J       count++;5 t. L- I1 U4 f# r/ V
     if(count==N)
# f7 _9 g/ w7 Q$ T        {p->flag=0;) M; g# p8 ~. A/ ~
         count=0;
! e$ ~+ Q$ i; G; T         sum++;}- [4 F& y* v& G% f
     if(sum==M-1)' `$ H- M  v! b9 K9 {
        break;" v5 z9 d& h- c: x7 O( S" g
     p=p->next;8 V* d/ `; ^6 F5 n: K
    }
/ S( s/ c& k6 K% _: p9 K    p=/ x7 S3 B8 S' ~6 @
    head;# [# Y& D. O6 c6 u) P4 Q7 _) y
    for(i=1;i<=M;i++)6 A* k1 o; `; b. a' d( \. T: R; k
    { if(p->flag==1)
3 ~( e+ u, d9 l/ U' a, ^' B        printf("\t%d",p->number);
' Z- [  G* o7 I" o) i( E) Z      p=p->next;
, D$ g! Y+ {0 X) J4 C    }$ T, c  h( A# i

$ w6 ^2 P% Q( f$ ^9 ]9 l
9 r* M3 B* z' u6 p/ T8 @# S  K7 H2 S$ a' F# s4 ?
}
6 v* X' ]# q" ?+ u2 s0 U+ f
第二种方法:数组9 D% z7 E2 c) d
#include<stdio.h>
* X4 j  F) y2 q# e7 _#define M 85 [  J. [7 ^; a
struct monkey
# S$ s2 K  P, A8 ]{int number;
* [% W3 R3 ~2 S* |, lint nextp;
& d; G( x8 B. P. t}link[M+1];' U; M; E5 c) p' A. a! f/ I
. U$ z) d' B+ E" B+ R* z
void main()
; s. f) c& W4 i& F1 s{int i,count,h;; C9 g0 b# A8 p/ i' B5 s0 ~
for(i=1;i<=M;i++)
$ y' m4 L# j) F+ s{  if(i==M)1 _6 V* B" X0 q* a* k
   link[i].nextp=1;
" `1 M, N3 M- l1 d- W# V/ ]   else/ _, r5 I* I+ S" e
   link[i].nextp=i+1;! c7 M9 J3 C5 [4 o3 A( N  T) H5 i
  link[i].number=i;
% {$ {' {5 Q" n8 Z- u/ A, t}! {; {: _1 d& b, e% k$ t/ q- t- k: M
printf("\n");4 d3 D# s) v; U+ r4 K
count=0;6 \9 @- Y6 G9 \& D) c
h=M;! W; y* P# U9 H# h$ i, y7 j* \
printf("依次退出的猴子: \n");* X+ g7 Y+ R) l8 j5 g
while(count<M-1)
- q2 o# _, m% D# J1 g! r{i=0;
9 ?0 O3 s; w' U* `! T+ qwhile(i!=3)6 j) P$ d. r# U4 h3 z
{ h=link[h].nextp;
, a: v3 `" T1 M" \" U; ?$ k4 J   if(link[h].number), f5 Y8 Q3 p8 `4 C% s
     i++;}4 N) q7 Y4 s0 R4 t- v; k0 i/ B

  ]. D: t% Z  w; d  g! ^( s" bprintf("%4d",link[h].number);! w5 H7 S' N3 u" r% \- |& @
link[h].number=0;/ s- Q8 Y( I+ K7 b, u' m
count++;
$ ^2 s; o$ ?7 p6 A7 x}( F$ Q( V% t  q4 f/ x

' q, Y3 U* l7 M. Qprintf("\n大王是:");
1 D# e1 w4 G; C7 u4 p  for(i=1;i<=M;i++)
8 m4 |$ V1 ^1 n4 m$ r8 W  if(link[i].number)8 d* Y$ b* L9 g' w0 ]5 j, X# @9 `  s
    printf("%3d\n",link[i].number);" n3 o( r* ~5 k2 `# T% i$ H  m
, j- A% y! e. G( C0 f9 j

- c7 U6 F& u7 h2 A8 H2 K8 d  S}
6 E2 \% t& H: k0 G
第三种是普通方法for循环
/ N6 P, l6 U8 b) {* Q' t
#include<stdio.h>
) a3 J* ~* h+ ^2 l. `0 o7 b/ u# evoid main(). P. P* @* K1 R8 g4 K! m* W* p
{ int i,k,m,n,num[50],q,*p;
( F  A( `7 w  l6 @8 R    clrscr();# X$ k5 g9 w  ~. e. D' `
   printf("input number of person: n=");1 }8 Z9 `# q6 N" t2 z3 H' ?$ c, T
    scanf("%d",&n);- L" d& g/ ]: o
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只6 X' x0 H% w( E! z
    scanf("%d",&q);/ D. ~. e% q( K. t
   p=num;8 C1 A# N! T/ K, N
  for(i=0;i<n;i++)/ D  M$ K5 O- ~9 ^8 K
    *(p+i)=i+1;
2 F( s# e: O8 q1 H' }9 x& b8 \   i=0;/ p) y) p2 r: S6 J. L. `
   k=0;  l2 d2 f" b8 f0 Q% d4 U
   m=0;' e2 m7 M+ ]2 c- F0 p/ u  X/ Z9 _
  while(m<n-1). A% K# X. o' F3 h
   {if(*(p+i)!=0) k++;
3 f8 y# S  G  @4 N2 S     if(k==q)) l; Z; o0 H9 T; C5 x5 |" _
      { *(p+i)=0;1 _. j* X1 o4 g8 x5 H% v
        k=0;# y. l4 D" j- U% j
        m++;
0 G2 Z$ q4 T7 z) F      }0 V, D. p  Y& G- T/ ?. ~# T
    i++;* Z* {& P/ S- o
    if(i==n)i=0;3 J6 n" G; s  Q# N8 n' K3 ~
   }- @( J. V5 ^3 x( [
  while(*p==0)p++;
& O* J- `* A1 ^7 s    printf("The last one is NO:%d\n",*p);
! B. m; F1 B) E9 a) `. r* h     getch();
) P) k! m# W5 d" R+ m* d6 @, b, k
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
& Z, }# Y- I. Y# X0 F5 f, _namespace 又费马达又费电. e) N0 m4 u% k4 {. j
{
$ E1 e" ]1 _; t: \+ b* A5 G    class Program; ?, j+ g0 L1 B. d
    {
% l2 q; A' E$ r% u# p! _2 T% O# }5 [        static void Main(string[] args)
5 v+ S+ k2 @% _$ I% c- K        {: z- j7 ^( V# O% I" h1 g# H
            int m, n;
5 s5 V* B# V& C# ~, ]) `            Console.WriteLine("请输入数组长度");- c; m. q, w  i* }) A4 p, l. ~
            m = int.Parse(Console.ReadLine());//m为数组的大小
5 w) s3 S1 i# G; I( I# X0 L, @            Console.WriteLine("请输入要截取数字的大小");
" E4 p, R# T& r1 t' e            n = int.Parse(Console.ReadLine());
4 f8 Z8 C: m6 h# ~9 t# `            int [] numw=new int& v  V* Q; F7 P+ T1 y

9 y" C% V, h- W% C3 I&shy;&shy;&shy;;5 G7 k( Y5 S4 y+ U0 U0 D
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
1 y2 @8 l) V* _% W1 Q            {
- {+ H$ ?; t' r% r+ a  B3 [                numw[j - 1] = j;$ ?& F. r. p3 K3 b1 K" o6 R
            }
' T, L! g+ `4 l( `  P9 L; r            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!" H+ u$ h$ Y/ w" m
            while (d != m - 1)3 h3 E9 c! W9 k4 D7 {6 }& B
            {  N4 u! j# O% q! z7 ]% p; U
                if (i == m && d != m - 1)% C6 x2 E& i9 g1 G+ }( O
                {
1 l3 |1 {6 D. {5 Z3 }  c                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
1 ^* }; I. L1 O. I' x                    continue;
$ G% i# O% L0 W* m, q" L% v                }
3 d5 b5 d5 n+ x7 y                else" Z( g  H. w0 j* ^8 T+ |
                {- K8 x3 ?! Y6 B  j
                    if (numw[i] != 0)0 q% @) Y% f6 e+ g" [% q
                    {
; ?9 j% q5 s* W7 [                        i++;
# M; x5 d: X5 V* o; U; V4 Y% `                        k++;9 `# L; t% A4 U3 V$ o
                        if (k == n)
  `' x/ y8 M% [2 h6 k                        {
% {6 w3 l0 K; W5 x# z* b% \3 g                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
9 ]. \, }1 N( e' o8 V                            k = 0;, D1 `: L: [6 M- E3 a
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小16 f  @, ?2 D. d0 G: X" P
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);: q) ]* P: i; P$ b
                        }
% a  ~$ M+ G% }# o% L                        else//输出暂时还没有改变数组元素的值
& {+ m% j, @- u+ g. |# B2 u" q                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);& q+ y) Y$ r$ I& C$ h$ x' j
                    }
+ {: \, H' A4 P4 o* l                    else
6 z' W) q) s) b% x                        i++;//数组元素为0,直接跳过,不计数。。。
" s9 O% l* R% }; h                }
' ^% _) L$ J) s3 y  d0 }! c 3 m. U& L0 l; W8 N3 V
8 W7 G5 I' p: }, X- l* a
            }//结束while循环8 o/ m, \; y  r9 t, l- x
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦3 W7 X$ U2 T- ^3 M6 e, Q
           2 f% H6 W$ Z  d3 N4 i" f
                if (numw[i] != 0)& g7 M* g0 E% s
                    Console.WriteLine(numw[i]);4 A5 N& i+ q' j* d1 g$ X
           / O. s9 D, S# W/ P
            Console.ReadLine();7 F, j& b! [. ?) b3 `3 D
        }1 `7 p* b6 X: {  F$ M. i
    }/ W& i+ Z" q$ E6 s2 i
}
* q1 H8 @1 X4 j7 a' T
小甲鱼最新课程 -> 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-3-2 14:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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