鱼C论坛

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

猴子问题

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

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

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

x
大家好!
3 F2 Q6 H1 C3 ]+ Z5 |$ X! L这几天我在忙着编一个问题,我用了一种方法编出来!2 d# w# V4 E, h1 a  G6 U! c
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
/ Z8 e. u1 u2 g# `2 l0 ~6 y注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 0 D; f: V2 B) {* I3 U6 ~

& [+ |1 S* j+ [0 q( h6 f) M1 v, \) p7 W0 x: f: j" i  c+ Q; S% \0 j
                            题目$ }  Q! {( U8 j2 g- ~. j$ S
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。6 b: [( F0 V# x
第一种方法:利用循环链表' j- w- s8 ]" O3 a1 n
#include<stdio.h>
: q) M& q6 [6 R0 L. H#include<malloc.h>
. Q! s, Y8 a# J9 O#define M 8            //共有8只猴子3 |- |5 @/ r& [8 V' T
#define N 3            //数到3只时退出第三只
# q0 _# m0 Q! F, ctypedef struct monkey, t3 j. T  K  J. ^; M* v; H. S
{int number;
& e( p  t; g4 t& q, b9 {int flag;3 T- o/ `, n8 M+ H" j& K
struct monkey* next;
2 d) W/ r/ ^& S! q}MONKEY;
5 C' N4 D4 [' j5 amain()1 }7 @; Y& A5 Q& U
{ MONKEY *head=NULL,*p,*s;9 ^" N) ^- t) Y  ?/ ^
  int i,sum=0,count=0;5 ]# j% }; ?- s) [
  clrscr();              //清屏1 B5 B6 p; W7 W) i
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
* ^# u$ G# T) W2 S7 j  p->number=1;p->flag=1;
. \$ t0 h  P* k& t4 b8 m  p->next=head;
2 O5 d" D% c+ O/ r8 F  head=p;2 F) l' E- k9 M& r; g, }* ]9 S7 t
  for(i=2;i<=M;i++), |% O0 q0 P, L+ T5 \5 D9 Q  f
    { s=(MONKEY *)malloc(sizeof(MONKEY));
, |& A3 x6 f) P% t/ ?3 G     s->number=i;s->flag=1;
3 L4 N4 O; y$ U     s->next=head;
4 F- A4 d( Q4 @+ T6 b. [     p->next=s;p=p->next;
! \: U2 E% o! C( ]$ d$ l    }
& `# d2 @/ \( I( a4 c    p=head;
- S, K1 _! i) {/ w1 O   for(;;)
8 W3 k4 U, V4 h- @0 ^/ p; y/ }    {if(p->flag==1)
# N: v: Y) y0 C3 W       count++;
! f' ~: d( y  d; k- k     if(count==N)6 }+ n. x) }. s
        {p->flag=0;: g2 ]+ M: h3 V% s. ^2 [
         count=0;
, Y8 I- B4 D8 ~* }         sum++;}
# z+ X5 Z& y* O' G* T- k     if(sum==M-1)
8 |. N- {3 f6 G        break;
: E  R+ ?# Z( L  C5 z     p=p->next;, v& @- \9 {" x
    }6 `+ o4 F7 I* ~, V8 j9 L" r5 D; |
    p=
$ ?) m  p6 T# J/ u    head;) ]. ]1 S. X. K0 \; e
    for(i=1;i<=M;i++)
' P0 r: k* E/ y$ d4 z$ C$ u: y    { if(p->flag==1)$ z. ]* s, F0 Y9 B+ t
        printf("\t%d",p->number);
+ K7 d) j' E( o0 O      p=p->next;
* z0 r% }/ k3 N! X2 C    }* U/ e, |# R8 Y% v: N
( j5 P  Z! v! ]6 i/ }
, y- L4 I6 x( n& g# u# |

/ z& I6 [6 D6 P  C}
! s7 E  D  j/ o7 P$ E8 Z4 |4 F
第二种方法:数组; E2 |% z- b+ h5 C
#include<stdio.h>
2 l$ B1 H4 T/ G#define M 8# t9 o; F0 G; B: C9 K! I
struct monkey
. y. v" i6 L/ P; ]. T' @{int number;
; a' x( B! e: ]int nextp;
8 V" X" k; T' f* c}link[M+1];
! K% ~( T1 h" m! y! e+ C/ l' O! m& T
% S# s" A% n* v3 Rvoid main()
% I" b$ J% F/ Z2 ?1 N{int i,count,h;
- V. x/ }& \. O) {' ]for(i=1;i<=M;i++)
3 Q) Y9 n8 ]- A+ ~: x{  if(i==M)7 \4 E3 y6 k$ S7 B% U6 ^! l8 \
   link[i].nextp=1;
  P$ d9 E1 m8 V   else% }2 R2 y3 e" t! t' r7 G
   link[i].nextp=i+1;+ S/ }: l1 n/ m, m
  link[i].number=i;/ f- @% f8 t5 [; H
}
  d8 b8 N/ Y$ h: ]/ R- Hprintf("\n");( d% W& Q+ l& T# E; s: b9 {# ]
count=0;# P, m! g; Q' v, T' b
h=M;. F4 F! p% f( L# J, I% T& I
printf("依次退出的猴子: \n");% p: x/ o: O8 g' U* v
while(count<M-1)
  k3 k  k3 {1 F$ F{i=0;+ P9 E' t# W: D
while(i!=3)
; Y3 k  T5 j+ J" b- t1 B2 U{ h=link[h].nextp;
5 L  B" l6 z/ [" e   if(link[h].number)* Q+ i  y0 w9 s; J
     i++;}
) e/ o& X, |: ?
. s: T. X* ~9 i6 _3 wprintf("%4d",link[h].number);$ E* N) }0 E! y! b
link[h].number=0;
) |/ `6 Z) }* |+ O  jcount++;# A- z4 m1 P/ L3 m
}  F6 y) v( H5 P" m$ P) y. J

/ B2 l* U( d3 r4 b' `printf("\n大王是:");. ^2 A# w2 n4 j8 Z
  for(i=1;i<=M;i++)! H$ _1 G% ]; `( i% Q8 `
  if(link[i].number)7 s  y$ z9 v& h+ Y; C
    printf("%3d\n",link[i].number);" y# N0 W2 G4 t' `$ W! Z& \
" W  j6 q) i& d) j$ T, N. y0 y

% s+ `+ Y2 T# A% b( M" l9 v. g( M& m" ?}
; g" l9 K2 i$ G* a
第三种是普通方法for循环

6 u+ Q3 M$ {- a: |: _! M#include<stdio.h>2 K) I+ \9 z# b: ]
void main()4 @" t% d: E5 A5 M9 _
{ int i,k,m,n,num[50],q,*p;" T+ ?, `7 ?" l0 i: v  T
    clrscr();, Q, M4 R5 E9 B6 i) V* A8 @
   printf("input number of person: n=");
, C) t3 b# u* Y# N) [5 }4 B    scanf("%d",&n);, m) @, p/ n2 s
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
' f+ Z3 w' ?# X( K8 W    scanf("%d",&q);7 {/ ^1 L. @  z+ X2 M) m0 F
   p=num;
* @2 @& O$ J+ H$ W6 M1 `  for(i=0;i<n;i++)
$ c- x! v" `- z3 H* S8 f& }' O    *(p+i)=i+1;* m. F7 g+ O  h% f5 _, \4 [
   i=0;+ W1 C- a/ s8 G- W0 A& _8 l2 f8 p/ b
   k=0;% n: e' W( C3 {7 d5 `1 w1 V$ {3 S
   m=0;
7 `  u; {7 y3 Q2 n) t  while(m<n-1)" ~/ w- b* Z( Y# S
   {if(*(p+i)!=0) k++;
5 K  s( o- s0 m8 N, V) g' {: c; S     if(k==q)% k# B( r, f$ z" L
      { *(p+i)=0;& D) N2 y( F3 \8 S1 q& m- |
        k=0;. g" t& ?, V2 ]( O4 O
        m++;
4 ^* T$ W) O% j. O* O$ @$ L! C6 D      }
9 J8 z4 D9 [4 @1 O2 C' S& q    i++;+ w; p  _$ U1 T! F  q
    if(i==n)i=0;2 W! R0 ?; U: r8 `, u; k3 j! {
   }) j3 S1 W( x7 p9 ~* w. R& ^
  while(*p==0)p++;
+ n- P2 u$ V! {8 N7 V    printf("The last one is NO:%d\n",*p);
8 g, _' R' @2 z* l: F- v1 @     getch();: n, r5 I9 ^% v: y

  r3 i' N" K' v+ R8 N% o}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
; a, B) a- ?4 z1 Q4 f# unamespace 又费马达又费电
4 z) ?6 F# Q, ~& U6 M$ t- }3 ]{! D6 k. |5 {7 q: X7 W2 P; d0 b9 U+ P9 E
    class Program
1 j+ ]. M; ]2 g2 n. [; `; C    {; s* ]4 m8 D0 J+ B. |
        static void Main(string[] args)
6 j: y8 J/ c; Y* K6 Q" [! u+ q8 k        {+ P3 o$ B& ~. p( N+ V0 J! n
            int m, n;, W, I; i4 d3 q! b
            Console.WriteLine("请输入数组长度");5 j0 y5 R" \1 r- Z3 l5 t& c
            m = int.Parse(Console.ReadLine());//m为数组的大小
/ Q( ~/ e+ ~8 o6 d0 R3 G( d4 K4 z            Console.WriteLine("请输入要截取数字的大小");
% `7 {; t( F) G            n = int.Parse(Console.ReadLine());7 m: y# y- q8 {+ ~
            int [] numw=new int
  V* x  l( |; B9 x- z# o
, I$ x4 K' P- B&shy;&shy;&shy;;
( X% ?2 A) V/ M7 l8 J            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
$ d9 @3 Q4 S5 w            {
! t/ H7 A9 e' ]                numw[j - 1] = j;" N; [7 s8 t& A9 \7 C( e
            }: N6 p# Z2 ?! g
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!$ k/ W; {/ F& v+ S: \' \4 ]
            while (d != m - 1)
* D4 T) J$ Z* T/ m! L' c            {
0 u5 D) K- m& ]; f+ s/ L                if (i == m && d != m - 1)
2 x9 Q: y) S# {1 ~% X5 t" B                {
4 H( V2 G" H/ q6 o6 D) q  N                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!% u$ s* v9 v' _
                    continue;
- o( i7 V+ ^$ [/ `- [! a+ A                }1 ?/ P' l3 ]# ]5 Z2 u
                else
* E  D' \/ `7 V7 A, O& B                {
  y. o5 X+ c* _& `' `, g# [* X                    if (numw[i] != 0)
* m, ^' U/ |) A                    {
, ^3 q% \6 T: `& P$ i4 {                        i++;
+ a3 x" L6 Z$ J6 V; L& w9 F8 Z                        k++;" N* W' s6 d% R' y; u
                        if (k == n)3 h! _# g# P8 f7 q6 n
                        {' _+ _7 s8 z9 c, b7 |
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了5 g& u4 {; ~4 k1 v" ^& T
                            k = 0;
/ \- \! _  @- d              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1* `2 `8 v5 e% B( Y6 A: P& C
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);! I0 j9 Q$ Q- @2 m% ?. I. n- k
                        }6 l# _7 p# ^( {0 |, ]
                        else//输出暂时还没有改变数组元素的值
* V% ~# I7 D+ B# r2 N) Z* ]                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);; w; g2 t! `1 F7 i( N0 D
                    }% X3 c. _; Q. q0 H: a  h( b; g
                    else: b, N7 Y2 G+ A3 g; R$ m
                        i++;//数组元素为0,直接跳过,不计数。。。( m3 u) x7 B$ A0 l" D% z0 _
                }
" Q( u# g7 v. z9 r/ W" [2 J
' @" z  u1 z- G& n- o4 H0 }( T% q" I( A6 |+ H
            }//结束while循环
1 K/ I( L9 c, l  h( O            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
# l- `/ v9 i  Y; c& S& n8 K           5 m! C5 Z' F5 Q( o7 Z! F
                if (numw[i] != 0)
! O' P( `) k9 c0 p& p5 m                    Console.WriteLine(numw[i]);$ @3 m& v, f& ?( ~
           " f' ?' e( ~+ q# n, K
            Console.ReadLine();* @- V* @: z1 s1 J. }/ t8 b5 C
        }/ ~" z0 s- Q4 a5 t, S
    }
" f, D. ~+ l: w, S& K/ z}
5 z8 t- l9 p- i; ^1 W% t9 Q- _8 {
小甲鱼最新课程 -> 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, 2025-11-7 20:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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