鱼C论坛

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

猴子问题

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

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

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

x
大家好!4 S- q5 w. _7 @  z* ^( Z
这几天我在忙着编一个问题,我用了一种方法编出来!
  h! l1 M. N) k# {但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
) |. j4 p! C9 z. ]3 p5 O6 }( g# v注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
8 |  t* p9 Y: e
6 y4 M( P6 L, }$ G3 V  T; M: P8 b/ s' Z" w2 {
                            题目
# E& s5 u4 Z9 }, W( _$ ~# f山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。5 F6 O1 }1 L/ T9 e5 J
第一种方法:利用循环链表" I9 Y& e: Y# c5 F
#include<stdio.h>
! H' f' {: Z1 U* h/ S- B: V#include<malloc.h>
- j/ V0 A3 o7 D3 d1 P' O#define M 8            //共有8只猴子
5 z. I! s$ \2 X& ~5 X2 u7 ]#define N 3            //数到3只时退出第三只
& c2 k& v: d9 z2 v  t8 ~7 Otypedef struct monkey
; K+ x' D% g7 \+ A{int number;/ y; |/ \) w9 E( z  b
int flag;; E! R' b2 ^6 U* R, X  o  R8 {
struct monkey* next;
+ l6 R) n; }6 k$ w- `}MONKEY;
. T5 d! d% q% \' A6 pmain()9 g4 l$ N6 a" t; F) z
{ MONKEY *head=NULL,*p,*s;  C( M# G* q  ~2 n0 _
  int i,sum=0,count=0;$ l; D" ?/ [4 w! o: h
  clrscr();              //清屏
3 C0 ?* r. @- @) |- A  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存* D" u0 _# X/ p- H- ^8 e% F
  p->number=1;p->flag=1;9 l; U! F5 _- K- W% I
  p->next=head;
; t' ]/ [1 k6 N0 c2 h3 H" J8 ^  head=p;6 s$ {+ e* T! r. N- y! N5 x
  for(i=2;i<=M;i++)
4 T9 v- ^/ T$ t+ L8 D    { s=(MONKEY *)malloc(sizeof(MONKEY));
4 \7 t7 p6 [( \+ D7 K     s->number=i;s->flag=1;" U& t8 P& K  q/ O9 g: T0 P
     s->next=head;
9 k7 u% f+ z) k0 `     p->next=s;p=p->next;
4 Y+ j( C3 v, l. ~8 W2 v! ?    }
/ P3 R  K  f6 W$ u    p=head;
9 T* L% {: q, s2 m+ M( e5 k0 J7 l   for(;;)/ Y  Y( u' S+ y: @# K4 ]- j
    {if(p->flag==1)
1 b! {% e3 i# t2 e  X       count++;
, V. @+ s8 o2 q. t     if(count==N)
* p5 ~% O$ f7 s8 }) {& C, ^# M! m        {p->flag=0;% U4 q% O# m" t+ x
         count=0;
0 b' H. ^* j1 V         sum++;}: d) \( V1 X% V( Y: S  a
     if(sum==M-1)& b9 Y# Q. \; c6 w# c# j
        break;9 R, s* g2 y) c
     p=p->next;
# I* W% H. L/ R+ D2 ~7 D9 J  d9 s    }
& O! Z' {" k$ M7 ^    p=
. O) }# w: z) X    head;% r5 J7 _; i$ w+ R) C7 h6 B
    for(i=1;i<=M;i++)
" x7 F9 w# B7 x7 b3 R" h    { if(p->flag==1). T' U3 A# k; F" l
        printf("\t%d",p->number);
3 U. Z- U, O/ ?/ Y4 Y      p=p->next;# S/ c% ]' K! G, G
    }" M9 I( V# `4 K  _- v' ?! _4 e
6 y+ Y9 r) k: C% D
; F- ^: Z& m! b
1 V2 b4 m$ D- k' ^/ }) m6 R1 }3 a" L
}

! h4 F2 g# L6 g7 T, W6 X6 E第二种方法:数组
& C, ?5 M. a' R: V7 x' o( D+ |#include<stdio.h>6 K6 {8 H, j& Y: y" W: @1 w8 W
#define M 8
; m* j" K3 I" ^2 Z7 O) p2 hstruct monkey/ {3 [8 H  v  w5 S6 l
{int number;1 D- ~( M3 M5 h
int nextp;% b$ o4 A& X5 [- H3 p) f
}link[M+1];
! x! |4 U. y! J! H& a( x  n- h6 ~. P2 S* j' x  @  S
void main(); C7 r' Y9 W0 Y# O5 F
{int i,count,h;6 N$ Z* y5 |+ w. d) s2 L) E; j" }
for(i=1;i<=M;i++)* S6 {( a$ k8 [  V/ B9 S/ [
{  if(i==M)
0 P  A; r, o" g+ z2 l+ @   link[i].nextp=1;! s) j- H, K" X3 i
   else) t9 O  \& s) ]
   link[i].nextp=i+1;& s. |7 K% Y  Q( ~8 z5 a$ e7 C6 f9 h  I. j
  link[i].number=i;1 ~0 G8 W& n( \+ ]% o
}2 M, }' [, [% `; E
printf("\n");* {& J4 e- h% V* d/ [, l
count=0;
6 w  n) M1 A, i* Ah=M;" a. b( ^# S! T- W$ A2 S
printf("依次退出的猴子: \n");% P4 N& D# y7 l, ]4 E( P
while(count<M-1)( A/ W1 S9 k; t1 G, t
{i=0;+ }( r8 E/ Y5 w- c+ l, S1 U
while(i!=3)
0 a: u8 p. b) W+ b: Y2 P{ h=link[h].nextp;, o' u6 d, b* k5 `! k
   if(link[h].number)" B9 ^3 w/ Q/ t; }) y- ^! i* ?
     i++;}; L1 U. F$ S/ |* W" `8 F0 G

& _6 e! H  Y8 Kprintf("%4d",link[h].number);
! {2 y! q, h/ f; c/ \link[h].number=0;
* r# G4 b  M$ {. {5 bcount++;  L- D! Z4 l8 E" ~: ?
}$ x  Z0 @+ s: D, A8 @. B
  V1 c( @$ X4 }! i
printf("\n大王是:");  ]3 r; y( i$ Q( k
  for(i=1;i<=M;i++), }9 o# e6 L2 T, Z% ]
  if(link[i].number)8 R! ^$ E: p8 h1 y% y/ I9 G. {
    printf("%3d\n",link[i].number);/ Q6 D: V. X- J" ?& l, `4 J: I

& T. H; I* t! e5 P; j; l. [! Z, ~/ h; ~, q. Z, y8 d- Z/ K% C
}

) Q- K% ?2 T  B! h  _: _第三种是普通方法for循环

* ?3 k9 a6 R5 s! h#include<stdio.h>4 K. e  b7 o& j$ v. V3 N
void main()6 M) i! F4 V. A
{ int i,k,m,n,num[50],q,*p;; Q" ?& z9 s  e/ h
    clrscr();# D- V( L: l& v5 n% Z9 u
   printf("input number of person: n=");  l) A8 ?, `# o+ o$ a: ?
    scanf("%d",&n);
4 e! N/ V8 |8 ]2 f3 g  J0 |printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只$ @7 u- t: g) |$ S9 d
    scanf("%d",&q);
( G: F+ H  A" _# L  M8 @9 ?. p   p=num;
2 y/ [, k9 t, A. A# e1 Q# N/ v0 r  for(i=0;i<n;i++)
* T9 f  F  n# W/ K- H    *(p+i)=i+1;, }& U: J9 y- U4 F3 ^' Q7 D
   i=0;6 }% N7 W. r. Y& D2 `
   k=0;: x0 G+ X* E& [* O
   m=0;
$ Y9 h0 _$ e4 n1 u9 R8 o  while(m<n-1)- u6 N9 g1 ]9 Y8 S
   {if(*(p+i)!=0) k++;  O$ [  v( n. X' y. j
     if(k==q)
& k6 H+ O' H  Z5 s# V: W      { *(p+i)=0;
$ ]* U: }. |( W0 U' g! d4 W        k=0;2 N: R$ Q7 @- |, w0 P/ R: s
        m++;
% |& j. {$ g  X) Z      }, K+ U4 E0 Q( u) \3 P* T
    i++;
0 I: N' w1 C$ C7 ~: K6 P* B    if(i==n)i=0;
0 R; r; G' c: a& N/ ]% E   }
9 v6 y% |5 ~( z* D! g3 u! n- R" D  while(*p==0)p++;) R4 }3 U: j0 k, _, o5 w* J
    printf("The last one is NO:%d\n",*p);. M. G' ^' n! g) t
     getch();& c0 ^0 A9 J7 k5 |9 z0 B. k

- S. e* ~$ v2 A. Z}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;. t; V! V- c4 @7 X) D( |! Q: W! q) H
namespace 又费马达又费电: k9 ~6 X- Q1 _2 H1 s
{
% y& I3 P* {  ^0 |7 I* n& h  D# E    class Program
6 j6 o: A0 t, D. {" f% p* z    {( e1 y) @% ^; t* F0 `: n
        static void Main(string[] args)
% R7 n; [% `+ ~' Y        {
1 ~2 M  L; Z7 `5 [5 }& @) C6 d            int m, n;  }7 p6 x; U* y) M
            Console.WriteLine("请输入数组长度");3 J) ?. ^& D8 ]. T% F, Q( u
            m = int.Parse(Console.ReadLine());//m为数组的大小
) t2 x1 {7 g, K1 @- S7 {            Console.WriteLine("请输入要截取数字的大小");
2 J8 {/ U7 Z, j4 e: F1 A8 b            n = int.Parse(Console.ReadLine());+ b- j4 K8 x% s( a
            int [] numw=new int4 I4 E* {  k) S$ m

0 i; T, l* i7 W* _' S! {  q&shy;&shy;&shy;;
9 S- f% G3 i! ~' l; G( G            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数. |8 E, N" o, Y) G
            {
% `  p% K' x% t7 ]3 C                numw[j - 1] = j;
1 g3 i" j. T# w8 V9 h! I            }
- ~5 A9 v8 F9 S' @            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!& i2 G. M' {; M, q' w& U% o; Q) d$ H
            while (d != m - 1)
% K3 J5 n# E* Z. i- B  r            {- s0 f2 |; x! T  U! T7 M
                if (i == m && d != m - 1)/ ^$ x& f' T1 P
                {& d1 N8 l0 J) B
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
& M+ t  P  U2 y) f8 b; m                    continue;
& T1 p+ \! s0 D( X$ l                }9 l/ Y7 G, ^3 G; Q% g5 F
                else
# x* x2 [8 M* R                {5 J9 {  Z/ m7 I4 h/ w
                    if (numw[i] != 0)
* Y$ K+ R1 |7 S" I! K& o3 F' ?' Y                    {
# t+ Z! K% ]' p4 a, I                        i++;
4 L) C, N% R) D/ N. d                        k++;. x/ e" F& \8 p/ d& o! R
                        if (k == n)0 Q+ J% I+ [& {( Z; M
                        {8 T% e5 @, P8 S. N. t* c3 u
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了' \6 e% |) X! g3 D1 G
                            k = 0;
) _' c) ]; F6 K. V; N  z) m              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
6 e5 X# d4 h- S& y7 y                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
. D. z* v0 {1 q% G                        }
& c8 ~5 ^: q* a, T* U% J/ ]% A                        else//输出暂时还没有改变数组元素的值% B/ ~  V8 h2 w& W/ G" ?: L
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);+ L& {0 X2 S. i' L/ ]: J
                    }
3 N7 |) V6 C) I0 a+ f+ {# I9 H                    else
4 T( ~8 S, [4 Z* x: }; K( ~  _. N                        i++;//数组元素为0,直接跳过,不计数。。。' R! J  S* j1 K: l1 b  V5 M* v
                }
6 M1 Y2 H0 w  x8 ]; P
& u4 F% p! ^5 K' p2 D( y, g1 v
  P7 z6 x/ ]) v) V' z0 N+ s/ A            }//结束while循环
/ \1 Q: {  j* ^* ]( c7 x  t            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦7 u6 ?$ k" ~+ L4 g6 V
           
7 o. x( P# }  w1 B3 X                if (numw[i] != 0)0 r4 N* c  k8 b( k, h
                    Console.WriteLine(numw[i]);
! {: F( a7 H9 Y4 V) c! V           
  Q! V- j( t; H. |7 }            Console.ReadLine();
1 S; a, |9 V" R' W* R2 f- ]        }- B' G1 t$ |+ V
    }
- k% ?5 i- Y1 |% K" A' _}
9 ?, Y8 ?* M' W$ `6 v+ J
小甲鱼最新课程 -> 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-7-11 18:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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