鱼C论坛

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

猴子问题

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

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

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

x
大家好!3 S) v/ ~) j$ X: m
这几天我在忙着编一个问题,我用了一种方法编出来!
' d0 E9 b" Z* {/ J; r但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
9 d3 g9 T' x5 a2 G* l* n) @! P& Q1 C+ m注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
8 L/ ]2 |1 ]6 ]4 K' X8 @2 B! W$ [2 V' t. w( J
) u( e+ u7 V( A3 g2 P5 o2 g9 h" I
                            题目4 Y+ c$ ^; g  E: ]" z
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
' u( c! X  M" h# n0 A5 ]' d第一种方法:利用循环链表
  s3 q+ Q, _4 ?) A  {8 C, H1 L0 b#include<stdio.h>" R8 p' t+ Y9 F5 u% P
#include<malloc.h>/ {8 z. }9 x$ G$ o; s7 M6 e" h* n
#define M 8            //共有8只猴子& o5 C  i! Z! e9 G# z
#define N 3            //数到3只时退出第三只
' t* l) F, a& _2 t) n0 v6 qtypedef struct monkey
2 B! @6 M+ F0 i" I{int number;7 Y4 d0 O# t$ ~' N  |' ~, D
int flag;
* z$ l1 X+ v( }* V+ Astruct monkey* next;" m% ]9 X' H" W5 t( b
}MONKEY;
0 ]' q- G  _. X: Rmain()' z1 ]. P  v, W# z
{ MONKEY *head=NULL,*p,*s;
$ g  h1 @( j1 G% @! G6 s  int i,sum=0,count=0;4 K# Q, E1 Q7 I* z
  clrscr();              //清屏, s- m! Z' u- R
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存/ H/ |- k- \' q% V* l# L' _
  p->number=1;p->flag=1;
, _% ~% V+ a6 u; v7 y" u: s  p->next=head;: H) |1 p; n! l- @- o' u5 d
  head=p;
+ j& A5 B- T. W! r; v, Y( h" Y  for(i=2;i<=M;i++)8 k6 ~: {* N5 V
    { s=(MONKEY *)malloc(sizeof(MONKEY));- @2 f0 ]0 T( `5 ]! M2 {( S9 H
     s->number=i;s->flag=1;
# n9 H' M7 `0 `* N: C. Y# ]     s->next=head;* S0 J+ Z! P+ [
     p->next=s;p=p->next;
( B; ~$ ]- H% {    }
! L( N$ b  ^# L3 P    p=head;
  Y; Z8 w% `" ?) s) s8 `   for(;;)
$ \9 ~3 w1 [0 ?6 t, n- E$ I9 S2 B0 \    {if(p->flag==1)
8 s% W1 }5 T1 Z3 q       count++;# B* N6 L$ o# b) J# W
     if(count==N)+ i- c' `4 {' j. s. B# f
        {p->flag=0;
$ P" r) W* X% k. U8 x         count=0;
0 d% D8 Y/ ~: L         sum++;}8 t$ X/ v, X- M* J
     if(sum==M-1)' t" C( E& q% p
        break;/ E, R8 B# S+ j* W
     p=p->next;- H4 @) O5 u" R  h
    }8 E) z% C4 j# L" C; y
    p=
2 t1 d6 m0 D, p    head;4 s; f) J# @  m0 C  c
    for(i=1;i<=M;i++)
4 }0 Z* C& x/ h" c    { if(p->flag==1)
% Z' d6 K9 z( V. E) d8 O3 _  n        printf("\t%d",p->number);
8 H! O1 }' \( v7 H' ]- N% M# {) E9 F      p=p->next;; ~2 T: `9 z+ ]$ q* ~0 C# H2 ^
    }
. B1 y. M1 |% ^- T
; v  @) ?. d  s' n' s0 P2 d( s! Y# T4 }' t

# L6 |/ S" C. o}

% p( S4 P/ W+ w7 @' v, p$ s第二种方法:数组# s6 s/ g! y% u* y. }! T; }, o' T
#include<stdio.h>9 ^- i9 r/ B3 c0 ?
#define M 86 S4 G3 c- {' O4 B" V
struct monkey
2 n! H4 _( S8 T$ O% ~{int number;- Y9 }2 N! x+ o- @. l7 |2 d# l
int nextp;
: o! M/ ^7 p! H1 p, S}link[M+1];
' T2 ]* K0 y; Z$ r8 c* w3 b% \4 F  v6 Q2 m. j
void main()5 [- X7 b# o2 ]4 F! g/ H1 H
{int i,count,h;
1 ^% v3 Z4 B$ w; M2 M! D4 G( Dfor(i=1;i<=M;i++)
/ t( E6 x9 E  V; s- g{  if(i==M)
  P" Q) I# L# M( W2 f   link[i].nextp=1;
5 q- H8 C2 S$ z7 H( K/ Q: t   else
! ^3 J& ]0 L* Z* A   link[i].nextp=i+1;
; Y' r3 B. {) c# o% ~9 G  link[i].number=i;
! O3 d7 N, y' c* a4 e}& [3 ]; R5 N" M+ D2 Q0 o: E& }
printf("\n");' I. X$ l3 h3 d
count=0;
9 W3 y' {8 G6 p" a0 ?3 T  Vh=M;
2 i4 A! ^( M" E+ Hprintf("依次退出的猴子: \n");
+ a0 ?* f; a8 x  t: {& d% kwhile(count<M-1)& n" @" Y4 M* l. i% @: p
{i=0;, ^- ^1 m+ r; o
while(i!=3)
% w- N8 r0 t. V0 h, `/ Q2 B# p{ h=link[h].nextp;0 x" T1 ]3 W7 _7 _1 m8 c
   if(link[h].number)2 b+ X9 B4 g4 u8 G! D! Y( u5 Q
     i++;}1 @* u* C$ }4 c& d* }( f

* n  X& j- A$ |2 B6 wprintf("%4d",link[h].number);
# @9 u: Y7 a8 Blink[h].number=0;
4 D: `7 Z& h! _5 Ecount++;# I7 b# j; e* B& \
}
1 x+ T  E, H6 g& T9 f5 X$ ^% o
. H4 I, f# F% x3 r* p" Q+ Tprintf("\n大王是:");
: H' y3 s4 G# ]: C3 d  for(i=1;i<=M;i++)
) z( i- E/ B* t  O: W/ A/ z  if(link[i].number)) C* O) ^6 B5 Y7 M
    printf("%3d\n",link[i].number);: O9 D  k5 l0 s
+ Y/ f. Y* u) n

# J& ]1 d* X: A* ]' z% x/ @% z  s, N}

9 c6 r( [3 h/ r: ^第三种是普通方法for循环
7 `7 q2 \) R8 W! }
#include<stdio.h>4 _- R; u1 i( |% ^
void main()
/ m2 X; }% W9 U* [{ int i,k,m,n,num[50],q,*p;
% b6 H9 {1 z5 q# s, s8 u    clrscr();+ d! ^& h6 }  Z* c4 |* N1 @
   printf("input number of person: n=");
- A) w3 m* f  A# t& _    scanf("%d",&n);
: {! X; D; @& ~0 i# Iprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只1 f0 C  d# M, w+ I
    scanf("%d",&q);7 `; \2 n1 s6 `
   p=num;+ v7 _6 C. B/ b- U/ s; F
  for(i=0;i<n;i++)
( h# U9 w' l4 j    *(p+i)=i+1;
5 w- G. w5 w% M( C   i=0;
9 M" j$ @0 c2 d' ]/ `+ R   k=0;
4 o* d* e/ j# ~   m=0;
7 |: N* B; W9 @" @  while(m<n-1), g2 R' r9 g" l" J7 U$ {
   {if(*(p+i)!=0) k++;
% N, V% H$ n+ N" }     if(k==q)0 ~" b+ t1 B# Z0 L
      { *(p+i)=0;* _: h7 `) _7 q7 t
        k=0;
- L5 Y; r( G2 u( A0 _7 Y! Y        m++;9 Y0 C3 C, a. s3 s* e" {% w
      }
+ t) E' h0 R7 P) I1 f' }% o: [$ S    i++;
1 e5 A3 B1 _9 D2 ^( i    if(i==n)i=0;# L; g/ p; T  g- E' O0 w  u
   }4 Q! B3 w; w; H" E, }% ]( D
  while(*p==0)p++;$ K- t/ v7 b3 ^# y8 Y+ n+ x# }
    printf("The last one is NO:%d\n",*p);
# `7 V5 @5 I* O1 q2 m0 |; j     getch();. F( ?/ s$ f' G4 h, b
; }. {/ l2 y) e
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
5 K' U2 k# t  d' e$ v1 Vnamespace 又费马达又费电
% N) \! Q- k# y$ B{
6 a# f% R3 I! `+ D) L2 C" S    class Program
' H( |3 f" \: a* n! {9 }8 O, m    {
7 `& C9 l4 g) ]% ^  H" Y0 M        static void Main(string[] args): V, U6 f, F6 \% s
        {
& b, r: E+ Q) |4 L4 K5 ?$ I0 T            int m, n;
. p# l, {" w& J+ f3 H# e            Console.WriteLine("请输入数组长度");
: _0 i2 ~! d/ N  w& T9 e  ^3 I            m = int.Parse(Console.ReadLine());//m为数组的大小! u; k# n/ g4 }! N( [  R1 t' `5 R
            Console.WriteLine("请输入要截取数字的大小");5 d, M$ N/ N. u% W9 J
            n = int.Parse(Console.ReadLine());* p5 H7 n: z3 o4 V( r& s
            int [] numw=new int
. y# W: Q! p. ^. ^  s* _& a
& U0 C( ?; [2 I1 U4 K/ ]&shy;&shy;&shy;;2 k& r2 @8 x' {$ D! e: D( R0 A
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数& O3 U. }$ {. q* `8 M4 ^4 R3 w. K
            {5 j, ^6 `- A/ q7 X5 u( C
                numw[j - 1] = j;
! x6 i8 B( [# a5 j# ^; {) z* [            }1 @. H/ \2 w' u7 G, g
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
3 e) o7 H# I' ^: c. F$ F            while (d != m - 1)$ N( ~9 f) h4 B2 ?3 O
            {
% u. x; z( D. V                if (i == m && d != m - 1)
+ ?% i' w- M8 U+ f, Q8 k                {
# w! s7 L  R5 Q                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
3 w' `# U' h# [                    continue;
4 x4 j) A  @( ]% n& r$ g7 C" [, i                }6 ]9 Z& A6 {/ {6 j
                else/ Z9 P5 u. H2 L$ s% J
                {
$ J" _) o" n) e0 n9 N                    if (numw[i] != 0)7 m0 q- q- ?0 K* h
                    {3 K1 s# e/ e$ {9 K6 W, a9 M
                        i++;. p/ i( f3 }/ E$ `: X
                        k++;2 S$ P7 L3 v5 [% W1 K% y7 w
                        if (k == n)
, c8 i. G( N: c4 |" r                        {6 M. T& l+ r) o# I1 |) K  X
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了  f$ b+ q2 _* t4 k3 o& n
                            k = 0;
3 c( ^/ U" a3 S' a  }2 ]: K, ]              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1( }  \' O9 x" M
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
0 S# S3 ?8 Y) O# v) v. h                        }+ g3 s# r' D) g1 B
                        else//输出暂时还没有改变数组元素的值% a; z) c" g( N
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
1 x( e9 O/ ]+ D+ W. T1 @( L& w                    }8 x, c8 Y8 i& T% V1 E" {
                    else
3 F$ D% s. q) F                        i++;//数组元素为0,直接跳过,不计数。。。
4 `, x- F% `( ^; S                }: q- ^# g+ L5 z9 U6 E" \
. ?: |: a/ l. _3 f. S

5 A. V% b2 o7 h            }//结束while循环
0 ~1 ~8 z! t: @" \! l9 X2 [5 A            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
( w4 H$ }% G  C, I0 r! U$ I           ! ^# m, D" ]- E$ ~
                if (numw[i] != 0)6 ?" t. o. t5 L: @4 x8 C& d
                    Console.WriteLine(numw[i]);' Y" B; n" S& H& w( f7 `* R; [6 h
           
6 r1 c0 O( q( K" r( _* N: e9 G            Console.ReadLine();
7 o2 X  J2 P( Y1 X, T  _& t' z        }. P: r, ^6 J# ^) D
    }, f1 f- Z! \, \  X1 r$ X9 L8 p! E$ R
}1 M% |# m, }+ 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-1-2 06:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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