鱼C论坛

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

猴子问题

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

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

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

x
大家好!/ `9 P" h5 p% ?) [9 |$ }( L
这几天我在忙着编一个问题,我用了一种方法编出来!
0 G1 }6 Z+ N4 e0 A3 F( M但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
( ]6 |& F2 ^$ ^) I3 Z# m' E8 T注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 / M3 l) V2 B# \5 l  F

4 Z! q) o( n5 N8 @
6 D: d2 S8 O5 m1 H
                            题目% C7 W  Y7 f( y5 f5 V9 j% o
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。6 P# b. @! [! p
第一种方法:利用循环链表
0 t7 _1 x- @9 K/ X: b  [#include<stdio.h>0 ?8 }$ b' x2 F3 Q; z: e8 ~; K
#include<malloc.h>
; W& B7 V& I8 v7 ]#define M 8            //共有8只猴子
3 e3 G4 N3 ~- x" R2 @#define N 3            //数到3只时退出第三只) }- X9 r6 r6 E
typedef struct monkey
' U, g8 ~" {/ f{int number;. R  ]4 f& x! ?- x, W3 j
int flag;3 U' @( D" E1 U( C* ?; k, Q
struct monkey* next;8 v7 O5 y- ]' k! ?
}MONKEY;& e( ^* U3 s5 o" g% ?2 D
main()
& a0 ]3 q2 L4 K" z, V4 y{ MONKEY *head=NULL,*p,*s;
; F! Z3 f6 ~2 K0 u1 O  E. r8 c  int i,sum=0,count=0;% g" z$ G- f! ?8 B, d* e
  clrscr();              //清屏
& d. L. J% v  E9 [" O  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
- @& k6 d5 c* H5 S- n% a8 j" P, m  p->number=1;p->flag=1;3 O/ {' @+ g3 D9 P9 P
  p->next=head;. v5 B+ l( ~7 `& q; ?3 k4 s6 G$ G
  head=p;1 z! [2 B& s' s% Z+ W
  for(i=2;i<=M;i++)
% y& V% G3 I7 F' [& h' j" G( c$ K    { s=(MONKEY *)malloc(sizeof(MONKEY));" j9 `: A5 b1 j
     s->number=i;s->flag=1;
& T* B' g; `! u: z2 f# b. A, B     s->next=head;
& G+ s0 `. Q' r: a' s9 r. Q     p->next=s;p=p->next;
! V* N$ b, D5 a' @/ I6 {' [" l3 N    }
4 `- d' }& K, ~7 U2 M    p=head;2 Z& F0 e% y' ^& q2 x& ~* {/ r
   for(;;)
, u& u# J# o7 I& Y- Z% y% `    {if(p->flag==1)
, o3 R" [( b2 N+ f# r2 ?       count++;
6 k2 p. \9 h+ {6 ^- S     if(count==N)' N1 Z% @& M$ @# h* D) X
        {p->flag=0;( I$ ?/ B, H5 x4 X
         count=0;
, T. m8 }$ `7 K0 @+ f/ |         sum++;}
. ?' L; Q+ e% N7 v     if(sum==M-1)% ]3 A" R4 K' }) L0 K8 P
        break;% Q+ d# u+ m5 Z+ G
     p=p->next;
0 N& D. W1 H1 h6 p  Y& N7 i    }
% ]7 }- m* U1 |: B; V    p=! g% h4 ?! N- S7 ]  x* E1 i
    head;
! ~# O' s1 T) ~% R! P! r2 l* ]4 O    for(i=1;i<=M;i++)) j( N& W* Y7 [5 C" w
    { if(p->flag==1)
( Z* F& B9 P( `( |        printf("\t%d",p->number);. D1 i: M* T8 J# L" u
      p=p->next;
0 m" i* N; r: u* s, }! Q    }
3 p6 `* s( p; P9 X0 c( T3 _8 b2 K5 O6 U1 p

% Z* W& S! @8 q1 {; r# H/ p* y8 X; t$ n. u* [0 K: `. Y) a' R
}

/ _. g/ Y* ]' Q2 j$ s* F7 m8 d第二种方法:数组
" ?1 m- A' ?4 e' d#include<stdio.h>3 d# E3 F& `7 T1 O0 }8 b1 `
#define M 8* \3 s( K2 Z8 z& k  l8 Y& }
struct monkey: o3 O( m$ }. @/ a; `# [8 L2 n2 |" K
{int number;
4 R/ a" Q9 B1 J' L/ A* eint nextp;
5 X% \/ D# k- Z9 F$ ?}link[M+1];
- }5 i) j& Y* K; p1 S, t& |" }! X* u2 H! \! B! P
void main()
+ j9 R, k) Z6 Q# C0 {$ g9 F) V{int i,count,h;  ^8 j$ i3 t2 R1 U8 a
for(i=1;i<=M;i++)
' X' v- q9 J- `! v$ k1 |0 e, r{  if(i==M)
  z# J/ h& |5 L2 E  @* {   link[i].nextp=1;6 O4 Z( t' w9 ^& j) k/ z* P7 ]% _
   else
& N0 ?$ Y9 Z$ h# o& k; t  G4 k   link[i].nextp=i+1;
8 z2 v" h4 ]0 G1 j  link[i].number=i;
  O8 P4 j1 [. c; k4 c$ ~}  }' A4 p0 ^" u2 V8 R+ M' L
printf("\n");7 t2 j. ?: Q2 ~7 n4 }
count=0;
: K8 {' K3 A9 k$ }# s7 Fh=M;1 M; `1 B# c8 _, H5 k
printf("依次退出的猴子: \n");
( M% H' ~* t9 B6 g$ z2 O. g8 lwhile(count<M-1)
% |# @: K: A/ g& ^1 W7 n) z{i=0;
$ e: \% f2 R  q$ awhile(i!=3)
0 {6 I8 M. u/ E, n' J& l" A{ h=link[h].nextp;
5 X1 @" R- L, i/ ?3 [$ |  N% q   if(link[h].number)& B* u" A5 _- n5 E6 b
     i++;}
& M. g! P9 w3 N. z# K
7 j  }* ?7 T5 F/ @9 B& cprintf("%4d",link[h].number);
7 U! \! e1 d* q! x7 ]9 C/ b. v; wlink[h].number=0;
9 H. y7 H- g7 D! U  N( bcount++;
6 |+ F  g6 }2 `* t. `5 K" ~}; |1 H% X; b4 B

9 a+ t/ ?+ |- Aprintf("\n大王是:");# \% W% u& o! t  `3 z5 w9 `
  for(i=1;i<=M;i++)
2 U6 z$ K: G" M$ Z" g9 T7 i1 a  if(link[i].number)' \. j6 H5 D+ I. y; ]/ p
    printf("%3d\n",link[i].number);
- y8 ?; L5 F, V6 y+ O) i% F. H, k3 Q
0 V5 }8 `; l; ^  o. k
" K( P8 ]) u& h1 `) \, g}
4 C2 F7 Q4 Q9 b% D6 F; w
第三种是普通方法for循环

- W# ]$ ~4 r3 s  H#include<stdio.h>7 h) y2 }  ]5 e" r  y
void main()
$ u# ~) Z. r( _9 G) ?{ int i,k,m,n,num[50],q,*p;! t% B4 @5 e8 O4 a- Z
    clrscr();
. `& p! N$ G- x% ?   printf("input number of person: n=");1 w0 |+ t6 ?6 g* T8 t! {
    scanf("%d",&n);
# \/ e! y  ~! D" j! [; }printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
0 ?8 O9 S2 s& \1 B" S    scanf("%d",&q);
, w4 b7 R- }, t0 q, h3 h( C6 Y   p=num;8 x; K( O! S9 ?& v2 Z
  for(i=0;i<n;i++)
* u: `8 S( B; g    *(p+i)=i+1;. }' B3 C9 X# j- v9 I1 ^  f9 B
   i=0;
( V2 I$ a4 j  T7 F/ e9 r( v   k=0;3 F8 `5 r; C% u, J, P# h
   m=0;  ~* H4 i% z* I: }: y8 ^
  while(m<n-1)
2 [4 L! B  \: G, ?2 g0 z   {if(*(p+i)!=0) k++;2 J& T  U+ m  m! r
     if(k==q)1 T" ^/ H) i, f  u- V9 O6 u; v2 u9 v
      { *(p+i)=0;
: O( b% B! \, M1 S/ ]& `        k=0;
' I- {9 |. N- s4 s2 s        m++;' F: g' N9 {( k# ^% P" Q: B1 m8 b) G+ c
      }& p; T; N5 `- e! H6 U1 \! D
    i++;
9 n# a& e5 l, J. ~    if(i==n)i=0;
+ k2 W: `; Q7 w   }- q4 A$ ^  d7 O5 Q) W% ^
  while(*p==0)p++;) {5 i8 E5 M* f4 I
    printf("The last one is NO:%d\n",*p);" y- M" S! `! A  r
     getch();
" Y2 e0 d( m- s3 a7 [, l7 k( A6 x3 X1 H& m# B5 \: u2 j: |, \
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;& Z3 N* i. Q4 f+ @# w) @9 v
namespace 又费马达又费电
: A% X+ k2 S% z  j; |{
0 u2 }5 I. q3 j; {+ n8 ^    class Program5 d" i0 `8 J# F8 s& k
    {4 ^, g+ W7 \9 O2 r& e
        static void Main(string[] args)9 n7 h& ]5 E( C' t
        {
* B  w/ n4 @6 D3 @            int m, n;1 t5 H6 L& i3 G) G5 V) Z) f
            Console.WriteLine("请输入数组长度");
2 m5 d' O" @8 Z) o8 x6 m* a            m = int.Parse(Console.ReadLine());//m为数组的大小
! ^2 I$ R$ f; u; ^0 i: a  `* J5 ?8 r            Console.WriteLine("请输入要截取数字的大小");! u2 x  `0 L' U9 {6 M6 C7 V
            n = int.Parse(Console.ReadLine());9 x1 u$ W/ G% s8 ?" j& ^) w5 ^$ L: p
            int [] numw=new int0 ^' D) y! P4 f. d, x

' D/ T; b% P6 C7 n$ W. X&shy;&shy;&shy;;
, X. @& @4 L9 Y' F/ Q- b) C            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
; I$ d9 ~- m9 a& \) g            {
5 j8 l4 d- C% V# s                numw[j - 1] = j;
: v7 f$ z" ?. h7 S            }
6 |2 Q( X4 q( P% J) y/ X6 K* g# s: i            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!1 Y" S: a* N: U9 c
            while (d != m - 1)
; {+ w" ?# ~" p9 t. o) \7 z' X            {4 z. G0 f% q: E* w8 ]
                if (i == m && d != m - 1): m7 H% {3 _) V% O2 k6 \
                {
; {% f) l  h& k# S3 f% e                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
" f( P4 ?: j# F7 }- d  q                    continue;
" M0 q0 k* ^1 a& B                }! L! @, ^& S0 @. c6 M7 p
                else
, K+ ?8 C0 F; v5 ~                {
1 t$ H3 H4 C1 X0 I" R$ F9 _                    if (numw[i] != 0)9 j  k5 B3 @% |7 m) t
                    {; S- I+ ]+ `1 l1 e. e
                        i++;4 h9 z! x' J9 ~7 S" l
                        k++;
1 z6 @& B$ i# B, O                        if (k == n)
! q3 j6 N+ \3 [                        {
" l% U, _5 y5 ~2 M8 d- T$ |                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
0 a& R' s( y5 [, q                            k = 0;
# n2 S& d6 l6 B3 N6 b) S+ J              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小14 v; H1 ~6 z# p2 X8 b3 [& f  m
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);3 ~( i; ?) Z! p1 _- N  C
                        }- U! l) E. O! R, I& F5 D0 ^$ ]8 E- Y
                        else//输出暂时还没有改变数组元素的值8 k1 [( s5 u4 _6 l9 `$ w
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
# [. Z3 g/ F7 j8 a& T& b3 C/ p( j                    }
* E2 N) m' z* {" D2 R: @( R                    else' M  t1 l& S: E+ F0 p/ b
                        i++;//数组元素为0,直接跳过,不计数。。。+ |" y* G# u" k( ^
                }
  h& i& U2 c- b* X- J1 V% k4 F1 Z
# m% c8 q/ H: P. N8 E" ?
/ O0 F( R  E0 @7 }            }//结束while循环/ F$ G8 b# G. j$ z. i7 G
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦5 T" ?5 n$ ]+ r% I" o
           
  g0 e6 f8 J& m  d$ }/ c% K: c7 L                if (numw[i] != 0)8 D4 E6 D/ }2 l7 L+ D" B0 b) a9 B
                    Console.WriteLine(numw[i]);
( T% I) D- r( c& p" f, O) Y           
0 n# f4 V3 A$ R" G& Q! \            Console.ReadLine();0 G% N  x, H: i% K+ o
        }% M% O4 |, H0 j2 c5 z1 |; K5 |
    }
& k) {( S8 O$ t1 i0 D# h+ H}( i* H1 c4 {# I, \( {- |7 D; C
小甲鱼最新课程 -> 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-21 12:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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