鱼C论坛

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

猴子问题

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

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

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

x
大家好!( R7 v/ {* E. S6 _! O$ [
这几天我在忙着编一个问题,我用了一种方法编出来!
- {  Y, _4 m" s( Q/ N" W7 p但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!. }* T* {  p! u+ {: D
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
$ x' ]' ]' O8 S4 [
1 V  w, P/ ^4 E. p; a
/ X6 ^5 }1 }# f' ?5 f" L4 P
                            题目1 O" M9 Y, }% l# e: I, Z
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
) o! L# j/ x3 U& R3 `  K第一种方法:利用循环链表2 @$ ?8 j; f/ Z. |2 z
#include<stdio.h>
6 d: n+ `3 a) _, `" l#include<malloc.h>
% ^% _9 P5 y4 d#define M 8            //共有8只猴子
3 M1 P7 p5 \/ S0 W0 s+ h& Q#define N 3            //数到3只时退出第三只/ Y8 g' H% K4 }4 u7 h6 f5 K/ d
typedef struct monkey9 j, W; a4 M' J, P6 m
{int number;! p% e5 X1 b9 j0 i
int flag;
2 w5 j. _( ?( d, ^* P* W  gstruct monkey* next;7 g1 W+ ?7 A( F% i' }5 z8 H
}MONKEY;
. `" R+ d" j: S, U& Q, emain()5 L2 _  g2 X8 q' D
{ MONKEY *head=NULL,*p,*s;) p% m! o1 _; A2 V4 |1 g
  int i,sum=0,count=0;+ Q- Q0 ?3 T& f
  clrscr();              //清屏
; n9 D0 W3 {- R  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
/ L7 z; Z& u3 ?  E5 B% [- {$ L  p->number=1;p->flag=1;4 R! U  J2 z+ v# O/ p' o" {1 a8 E
  p->next=head;
0 J9 }* r0 O9 ]  K+ \/ d8 ?  head=p;
$ i7 O2 O: v% I; y0 \  h  for(i=2;i<=M;i++)8 `$ q9 @2 h" M2 l
    { s=(MONKEY *)malloc(sizeof(MONKEY));
5 v, ]2 Z2 d2 L* M5 H- _- c     s->number=i;s->flag=1;
( {* u4 R/ s4 i/ H- f     s->next=head;
- Y7 |7 ~3 P# I; I6 \0 L/ F2 c6 x" \' V     p->next=s;p=p->next;5 D1 m8 A% ]+ `5 a4 }7 q1 _
    }1 M1 J0 ^& q0 w0 P. Q
    p=head;
, }, T. N, w, K0 ^8 f% ~. f   for(;;)7 b) a4 }( t, t5 p  @
    {if(p->flag==1)
/ I, L, d  p( j9 g- c       count++;1 [! V' V! o; S7 _' \
     if(count==N)
2 ?1 [# C8 T$ f" L3 H7 o+ x        {p->flag=0;
6 X1 x1 B* ^8 A8 f         count=0;
0 x; f( N: ]* u         sum++;}2 K  c3 A7 e+ Y4 S6 |* O
     if(sum==M-1)' I: A0 p$ E1 @  o& T- @5 I
        break;
1 A0 T' y& M) i0 l+ P: R     p=p->next;
/ E6 ~7 ?- o& K5 W  D% k8 F' q    }
8 H9 n( J1 T$ c/ d, b% W    p=9 w6 R* S! j& v
    head;
4 d2 z/ b7 Z& M, c8 J" b( R    for(i=1;i<=M;i++)+ w# F* b5 T2 M: p
    { if(p->flag==1)
3 C% n7 T/ h& C% T- o/ _! J        printf("\t%d",p->number);) _* d5 I. L8 `6 W! p2 N
      p=p->next;* \3 j# U, B7 V3 e& w/ ^/ R
    }
3 s3 S( O/ P1 [6 L+ |' ]
- }4 l1 A# Z) E# e  l9 R' {/ m9 j3 G! p" I# }" q0 B5 _

( O$ S. ?2 i1 N1 W$ }# J& u' G}
$ K& C: l, I% X
第二种方法:数组/ A. G5 e! G+ w, ~- `- b
#include<stdio.h>' d$ V1 w' X8 `8 N! C) L
#define M 8
3 [" ~! ?  l; l5 Z& X' Fstruct monkey
+ L9 U* `& G9 N5 o" |8 s{int number;
% C1 @( ~; [3 e8 L7 ~int nextp;
& J5 f* K, ?" Q5 ?}link[M+1];* M* l: `2 Z1 @1 A
% U. M( }# z, ^4 j4 h( {3 ]  Q
void main()
2 J$ `9 J  C( M* q# f{int i,count,h;
3 P  ]% h4 `0 ~: Xfor(i=1;i<=M;i++)2 k1 m; V0 |6 K
{  if(i==M)
- l. p$ U( C; X& e+ l' c   link[i].nextp=1;0 C  `+ C1 R% |5 @( k* ~/ U7 w) H  j' N
   else/ a6 _) S3 c+ u
   link[i].nextp=i+1;9 F5 \) ^( e0 n- Y- U1 v
  link[i].number=i;* p; l! p6 j1 h' `: g. {! o4 l
}
, b7 d% n/ ~' b+ Y' C, fprintf("\n");, \# c3 C" x1 \1 d# _; S
count=0;
/ s3 l8 `7 ^  N' {6 s( A8 }h=M;
, K! l- k) w2 m0 D8 tprintf("依次退出的猴子: \n");
3 H9 n9 x, }! O7 E6 T6 t( bwhile(count<M-1)
1 D4 D, l; D; T8 w* x{i=0;$ b: ^  O( K6 E& o* z
while(i!=3)! |" _) E; [, x/ E' a
{ h=link[h].nextp;6 s! M0 t! M, M% u9 r* e) L
   if(link[h].number)9 t! @6 y. r4 D  V* j
     i++;}% \7 K: `1 O; I
; A6 L$ t- c1 A1 G; R* [
printf("%4d",link[h].number);3 p* Q! |! L- u, h" Y, T
link[h].number=0;
! X0 Q) g8 i' ~/ e0 t" p8 ucount++;
8 F# X6 o' U/ K  o; ~/ |& G}
8 V8 W3 `2 }4 g8 d
+ J+ {; y8 z0 `4 \$ q  pprintf("\n大王是:");( W$ ^9 f4 U: k
  for(i=1;i<=M;i++)8 J0 a) X/ e. z. `4 i: E6 b7 N
  if(link[i].number)
. e0 L+ u4 F4 o1 t    printf("%3d\n",link[i].number);
, Q+ w0 S1 u3 ~. u5 c% V+ f
3 i2 m; c9 d$ N) U
+ ?6 y1 U+ m3 s8 w/ j( J}
+ P3 `; o( C* _$ o- Z# J6 ~
第三种是普通方法for循环

# H. P4 N1 _3 [* @: P: j#include<stdio.h>
. Q# m6 G7 Y( V/ Y. b0 @void main()
  }2 k4 D/ G7 c6 Q+ t2 l: k3 ~) f{ int i,k,m,n,num[50],q,*p;  J) e6 W/ Q# h0 ~2 L$ K0 Q. q
    clrscr();6 ]' Q/ g. L- J- ^$ a, h
   printf("input number of person: n=");
6 B- V  P, j* ~* z    scanf("%d",&n);: A% m. n7 R- w. @
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
5 ^1 ~) M5 r! W' T3 Y    scanf("%d",&q);) a# j: o; d  b0 b) ]
   p=num;& F3 b( x- z4 b
  for(i=0;i<n;i++)
# T3 y& z! ~& J: U) s    *(p+i)=i+1;+ |9 b5 X8 I0 Q5 a6 y
   i=0;7 H( U  j5 ^& L+ ~; F5 K5 b0 ^( N
   k=0;# u# ?: `& h( O9 F2 u4 L( p- l
   m=0;$ s+ H* A$ n1 M4 T5 Y) N3 J
  while(m<n-1)
. R2 x6 W' s  E! P) L3 v   {if(*(p+i)!=0) k++;
% G( G# g9 I4 z, e3 m3 p& [     if(k==q)
, c9 Y2 `( V% K# ]      { *(p+i)=0;) b4 l8 h. i/ p) E' @: v  C4 }* P' ?
        k=0;
" Z5 K& c" o5 d8 e8 S$ K% s        m++;
: r. g% d& P3 s      }/ c- \5 e. b( `. D
    i++;  W, R6 |$ ^9 o, x' b2 {2 W
    if(i==n)i=0;
& C' T3 }# k: f3 v   }
4 k* i$ o7 n5 n3 \/ u* H4 p  while(*p==0)p++;& r9 P- L' [2 f8 C' I0 Y0 H2 T$ A
    printf("The last one is NO:%d\n",*p);  p2 q$ c- J! m, c
     getch();
5 m7 V$ i, Q4 t, a! M, y+ F% V1 L4 b3 V$ B  t5 \: T  D
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
/ |* ~7 v" ?! `namespace 又费马达又费电
: P/ v. `( a4 {2 S6 F$ P{
4 \9 e1 C2 |% D. R2 k$ y3 d    class Program
) ^. z! c0 n8 b) _9 ^    {
  T1 s. _! f' w9 h( D        static void Main(string[] args)
& z4 X$ Q% F: U! j3 V        {3 @% s3 G- y  S! U- Q; w, t- \
            int m, n;
% ?" Y: v; x7 d& i# ~+ |) j8 V9 l            Console.WriteLine("请输入数组长度");
* j2 `$ w0 u3 q, D3 S' w: ^            m = int.Parse(Console.ReadLine());//m为数组的大小! G: m3 u' v! Y6 w- s
            Console.WriteLine("请输入要截取数字的大小");) ?. j9 i* Q# ~; x
            n = int.Parse(Console.ReadLine());+ F& i! N( ?/ [
            int [] numw=new int- ]& [5 @7 P  `& e
: L& _% L, j, t# P9 R
&shy;&shy;&shy;;& Y4 j+ M8 v9 W. T! c& _
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数4 m" T7 k4 p; C( I
            {
7 y# K$ k2 Y+ a! d* B. `/ L+ `                numw[j - 1] = j;
3 j& A% D! x% B! @; W            }3 |6 _# Q' P6 o( h2 K
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
5 H# i6 Z' a: A* X, r            while (d != m - 1)
) h' c2 a/ B" D7 h/ [; x" L            {
, W# O# N0 a. v# k% M                if (i == m && d != m - 1)' N5 A7 n4 H2 i2 c$ v! `
                {. C- T& K1 g# o% ], l; ~
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!4 ]/ n  U+ p4 D4 A0 n; w3 ]5 t* G
                    continue;
4 d! l: \$ F( L- n/ S: U                }
  ]& s& C$ H9 C# P) g  k7 G9 t" e                else- h8 k& ^' g) J  ]; T
                {
* \" r- l5 C" l8 j2 u' G) u! \                    if (numw[i] != 0)5 ^' M8 c: t. W  g' h
                    {0 N) t. ?# R3 W: ?
                        i++;
# V, p4 b8 q* C/ m. u5 {! ~                        k++;" M! F4 M( k; [: d4 {! M4 Y0 V8 ]
                        if (k == n)$ m) z; a8 ?4 l1 V0 W/ D; \
                        {
9 g& {( c7 p7 r% H; W) O8 |; g* I                            numw[i - 1] = 0;//把在n位置数组元素的值改变了. B9 Y' C& z. P+ z4 c2 D
                            k = 0;
! I$ t- K+ ^" ^6 O) n; F, V              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1# f" v2 u" Y% P3 ^7 ~
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);9 B" i0 J  S( \4 b- e8 I$ d
                        }2 u( T4 y7 g) ~+ V
                        else//输出暂时还没有改变数组元素的值# `- k9 t5 X5 N7 M8 V
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);( x# U7 k( |% {
                    }6 q# B+ O4 E7 q* H% H4 t
                    else" h/ f& e  g0 ?5 a, H7 z  c  O
                        i++;//数组元素为0,直接跳过,不计数。。。4 x5 @( o# [! b5 M/ B6 p9 a
                }% Z' e$ h: @4 [& S
! t7 P! B& A/ L% o8 n
8 ]9 S& }' c' |3 K: F- D) D# Z
            }//结束while循环
$ k# q% F2 ]8 q            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦& r" d! ]$ G# r8 j: g" `0 u
           + w6 w. N/ d) l$ M; z
                if (numw[i] != 0); r5 ]: o+ X; _2 W  T0 ~
                    Console.WriteLine(numw[i]);& k: s- t3 a' e% Q4 C1 |
           
4 V* `% z5 P$ @9 |9 b4 `  _            Console.ReadLine();3 P; ^" L0 f3 O( O
        }
1 t: G+ ~- j/ l4 C5 B    }
$ S( a& F- v; r+ Y: w}
0 n# O! M$ Y/ r- E
小甲鱼最新课程 -> 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-4 13:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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