鱼C论坛

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

猴子问题

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

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

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

x
大家好!
  ?; b$ e% Y; j& z8 S这几天我在忙着编一个问题,我用了一种方法编出来!
" w8 q+ C7 q# }! ^: K5 k但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
6 K9 y, v0 l: A. H4 m注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
, o3 X$ ]  Q$ e- K: E  ~5 |
+ o9 a  W4 d1 k; d: _; L/ @: H5 _5 H; I# k
                            题目
! |* v  K: U3 P' L5 s山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
! f! j. ~0 ^, z3 ^7 \* b9 o& j第一种方法:利用循环链表8 P6 U' ~6 R5 M! R7 |7 ]1 H9 C
#include<stdio.h>6 Z* J! S; I- ?6 d
#include<malloc.h>. _4 Q  h) R3 b6 q3 C+ {' G; ~
#define M 8            //共有8只猴子
) F% M# z$ d1 q9 q$ L. O7 n#define N 3            //数到3只时退出第三只
0 x! t6 m2 r! B: d9 itypedef struct monkey
) R* `  f! e7 f+ f! P9 R{int number;0 e3 q, c; F# r; r2 Q' S0 O9 U. f9 `
int flag;- Q( N0 e: E0 B- i" g* \  b' X
struct monkey* next;
) x8 a+ ]$ A0 Q3 R1 M: p}MONKEY;
) g& l9 U* K( U! Imain()
' C' U3 u: R" l1 Y; v( S6 y. d9 \{ MONKEY *head=NULL,*p,*s;  i9 }% K( W' T$ b( U
  int i,sum=0,count=0;
$ E) d9 D! F4 u$ Z2 T4 f4 V  clrscr();              //清屏! a8 @- }$ }4 H8 e4 k9 k
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存. E- P0 ~. R! A& A' o8 p% v4 v5 n0 t
  p->number=1;p->flag=1;
9 ?5 _+ D7 {0 |9 G3 _7 v7 W  p->next=head;+ j# M& @; o' C
  head=p;1 g7 v& h2 w: A5 p, W: e: T
  for(i=2;i<=M;i++)  k  c5 {+ U8 g2 h% V' Y& {8 f/ ]
    { s=(MONKEY *)malloc(sizeof(MONKEY));, {" C  F- ^; K: v: \
     s->number=i;s->flag=1;
- h' ^4 ?' U4 y! s9 m. Y     s->next=head;
2 v. l; w# v7 r! c" }) \! V+ G     p->next=s;p=p->next;
5 J7 w4 U$ r" |8 ^6 y4 b    }4 F* k) [; h7 z
    p=head;
5 v/ D& [$ d2 j% g- {   for(;;)- f1 c5 p; p$ e. x/ S! i/ V2 q
    {if(p->flag==1)+ {; ]$ S$ j& \# z( d  y$ C
       count++;$ a' D' \3 D$ n- s# i$ N* C; R# u
     if(count==N)' U' A- _  [# C6 b5 R+ u' e: r
        {p->flag=0;
0 m3 e2 @# W- ]# o, j         count=0;6 E9 F* u5 k  C! W  [+ O  ]+ T
         sum++;}
4 W2 Z: z$ Y' G. m     if(sum==M-1)
: ], c% o) D) O8 C        break;' {$ n% d7 \$ I8 e
     p=p->next;- {! p9 G8 X! k# z: [
    }
0 b5 v8 z) g& [5 U    p=- i$ }8 N. M# u& n
    head;/ V! T" N8 ?/ ~2 |% m# S" e
    for(i=1;i<=M;i++)/ d$ R- t- Z( }& j. F9 d
    { if(p->flag==1): {- Q- I$ |8 [7 K; E
        printf("\t%d",p->number);4 v9 c  d! G+ `; I' M: F3 t
      p=p->next;
2 U  [0 k1 \. P9 v& B2 u- \    }
, G1 i& I0 B0 T5 ]
% O- J8 J0 F4 F$ A- Q, d2 v" |( b, ^% \

; z. ]7 k$ Y& c}

" \: I; `$ a- J1 \- v第二种方法:数组
( f+ f7 r' W+ S1 W  b$ |7 o#include<stdio.h>
& b- k  C# T2 H# F" N) r& l#define M 8. e) a+ D& s6 l' y7 t4 q
struct monkey4 }, H& Q% n, S) E0 |6 X4 P
{int number;
- \- q/ r$ m+ Q5 Q* yint nextp;
; Q& z6 K/ k! M) V# L/ i/ x) D4 w}link[M+1];3 T# g2 C! }) W2 o6 u. l

2 C7 b) j: r3 t3 Y& V2 A) n6 wvoid main()
$ m0 y% ~( H( I2 D. q{int i,count,h;
- {2 q- Y/ W* k  u. b$ kfor(i=1;i<=M;i++)6 A4 Z8 [& k! Y9 e$ ~% C
{  if(i==M)
6 v$ Q7 I; f. G/ H# g  A) t/ X   link[i].nextp=1;
, K% P6 Z* B; k# B; G9 k% @   else
# t9 h( x$ f7 G   link[i].nextp=i+1;
; c6 T3 L4 V7 X% M1 A0 G  link[i].number=i;% c" b6 z" n% k
}
  y9 L; U9 l: c7 l; R5 Hprintf("\n");
1 b" `+ v: A* {. n7 t  V" Ucount=0;
- m, M! Y# [' E( Gh=M;
2 V# d; g  {5 `1 [$ W+ i6 }$ Qprintf("依次退出的猴子: \n");+ a# i" T1 a# s5 R% ?
while(count<M-1)9 f0 v8 ?/ ~# X3 ]
{i=0;0 Q$ H+ I1 J* O" Z9 q$ S
while(i!=3)
% @& T. v  q$ D: {+ L. C5 I# ?{ h=link[h].nextp;
  G1 h7 Z% H9 N: D8 ^0 K  W3 h   if(link[h].number)" _+ L* Q' s+ i$ _
     i++;}( f, R) O6 O, U! J/ Z' o% I9 u
  w+ y% Q/ _/ A3 i
printf("%4d",link[h].number);& c# |+ b- W% b( C. m+ N1 E
link[h].number=0;; ]: o+ j0 ?7 i" @
count++;& W! t. s- R: M: o2 s
}0 L& S1 |9 E* ?+ @% R* c1 o
* B4 p, s" u( W4 u6 W$ q8 n8 ]
printf("\n大王是:");
) U3 J) O& O/ f' p! Y4 {  ^8 |/ G  for(i=1;i<=M;i++)
0 L# N; ?( ?  N6 B  if(link[i].number)
1 g$ H0 }2 X* e; z: n2 M    printf("%3d\n",link[i].number);
% U5 e* s5 m  v  D( C! K
8 r6 _- y) \: g
. C- m3 L- ]2 B1 R; b) `}

# d. K- n" ?0 [7 J0 c第三种是普通方法for循环

/ [$ q& G6 L! ]/ |  w9 K& X+ g#include<stdio.h>+ @3 L3 [& {% e; f5 i' }( p
void main()7 }3 M' c3 E; `& I; u4 L
{ int i,k,m,n,num[50],q,*p;/ E3 y% O: @* Y! y) q1 B
    clrscr();" v9 A  _6 H+ s$ I
   printf("input number of person: n=");
8 a& i, y2 [* j% i* V4 B' p    scanf("%d",&n);' j' h2 t- R$ p$ Z/ p9 @- v
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只% n5 c" p: ^+ j5 g7 M4 B
    scanf("%d",&q);
" g" u9 b& n. ?  e5 m# w9 g   p=num;
6 ^* z' [- e* H- c  for(i=0;i<n;i++)# Y, l) P& s  ]& M# x9 r2 @( P
    *(p+i)=i+1;
; j1 n3 X5 k9 U, K% d9 ^$ @   i=0;
- Q+ m8 Y: O$ K7 f! b$ g$ k   k=0;: W& ^8 J7 {9 B" R$ M
   m=0;
4 ?  E8 s" B% p) f1 C$ X  while(m<n-1)
" G; N- G0 y, ]5 K: i+ n0 H: E$ O1 T   {if(*(p+i)!=0) k++;8 ~& B& i4 z; ?) G! e2 U8 M
     if(k==q)% a' ?' ]' S: Y, T9 m
      { *(p+i)=0;8 J7 o2 c! e3 `  `; ]4 F  [
        k=0;
7 s/ T$ `9 o6 R' N* |: q        m++;
/ Z# S0 @5 Q1 g+ G. ?) w. z% H1 t      }. ~  K1 N$ j# t, W
    i++;
4 |: m0 x- [8 D* b5 g  D    if(i==n)i=0;
4 i. d5 n7 X4 N; b2 l5 V5 u   }- Z& T5 {4 `5 T+ ^6 F
  while(*p==0)p++;
! j" n% ~+ q1 W0 I2 F/ c    printf("The last one is NO:%d\n",*p);
2 d- A7 f4 ?7 C3 }" V3 i     getch();
( B$ m7 T% B1 J% ^. i( P6 m
( n9 w+ R; P' \# ^' Y+ V}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;, V& P2 f, K/ c% ?# H
namespace 又费马达又费电
# R; o& z, i. u4 A{; y4 R6 P' ~: [. C
    class Program: `* ]! |! M/ F1 c4 C/ v; W/ O: C
    {9 Z! R* X& N  w& l
        static void Main(string[] args)
6 S& ?1 k& O2 ^6 i  [9 n( p        {' C3 i/ T4 H( S+ N2 k
            int m, n;
+ i$ t  F0 z/ t" w0 @            Console.WriteLine("请输入数组长度");
1 O. s  S6 {% X# Q: |. Y            m = int.Parse(Console.ReadLine());//m为数组的大小: U5 R% g2 c2 a! r6 U
            Console.WriteLine("请输入要截取数字的大小");
$ c2 w# s; A( c+ ?1 y            n = int.Parse(Console.ReadLine());# R/ E4 K  C- r, \! A5 W" J
            int [] numw=new int- ?; H& i6 w% K: \7 t9 s
( {8 M4 g7 P2 d* x
&shy;&shy;&shy;;! t" V2 |! Q/ A* D+ V: B
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数$ {" a2 C+ I# v6 ?
            {
3 z8 p& g. b& e+ D# {4 J# n                numw[j - 1] = j;7 r# p; j2 N+ T. y" I( ~' c
            }
$ K# c2 G" p) S7 |8 H6 w; L            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
* R7 c7 f) l& Q4 ^            while (d != m - 1)( C6 p0 t% {8 X) b) k
            {
, `2 P* \  h! I! c5 N- i' q                if (i == m && d != m - 1)
$ x/ O6 z9 [# B0 D) u                {
. d; {' ^. v6 K  W0 V. V: b                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!; U# }. H5 p$ X2 k4 }6 h
                    continue;) z5 K" D$ [9 j
                }/ p  U  f1 a  X4 }' E$ y" k
                else# r# }2 t  \& Y: C0 `  p
                {
( }% I/ }2 S1 {% {6 c                    if (numw[i] != 0)
# H$ c2 n( y. Z9 c                    {* H6 D7 r0 `8 ^7 a0 I7 C
                        i++;
0 u+ |. m1 s2 m& Z                        k++;) \/ s* Q8 v0 G' m
                        if (k == n)( Y8 x1 |$ x' F$ R6 _
                        {: \  T' K, k. }0 ?( n: }
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了0 D" C& }- ^# r$ K2 b0 V& ?
                            k = 0;0 x$ x6 i  ?0 X2 W& g0 _; z( d
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1  G) H5 L6 E0 D+ l: o
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
$ Z" W0 y' a& L5 ]/ p                        }& w! O$ [) `, U4 w) ], \$ q9 X7 ~
                        else//输出暂时还没有改变数组元素的值
! E* V& \1 ~. f; t8 W                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);& g% c* g$ y! @5 I
                    }
' j$ E+ i9 J4 }                    else  e' h  H) |- l' O1 {2 p6 y* z
                        i++;//数组元素为0,直接跳过,不计数。。。
# s" N: g/ d& V. G5 q                }0 y0 y3 e$ b( `6 v8 H+ e+ h, ?
2 h, P5 S6 P- H/ E: u
" r, s$ D1 l: B/ {7 L" c( ?
            }//结束while循环
2 e: t6 f" _+ ?5 {, h) }" X            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
  j7 @3 @/ P. H& H! `  L5 C7 ^, {           
; _1 K; q7 R; A                if (numw[i] != 0)
; B; v( C* {% J8 R3 j; d                    Console.WriteLine(numw[i]);
6 P. O/ s* {# d) D( ]1 P           7 t3 j1 t0 U; p' L
            Console.ReadLine();
3 K! l0 T3 Q/ H. c) O* L3 ~$ ?        }  a( j) o- N; @* Z6 N
    }
+ c6 J- {# Y. S4 |}
1 O& w& W4 J6 f; s2 d
小甲鱼最新课程 -> 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-10-30 23:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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