鱼C论坛

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

猴子问题

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

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

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

x
大家好!1 p) C+ {5 X+ n& `- ]- s# S( h% C
这几天我在忙着编一个问题,我用了一种方法编出来!
( c4 h$ s0 v: n9 m但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
  Z* S. |, c8 v注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 , V2 T7 j: d6 T2 Z! w, T
, y4 l0 g4 g8 k

# N& O) A, |4 G9 u4 v7 M9 Z; K1 M$ E
                            题目5 a$ ~5 n7 \0 O3 P0 [1 q( \4 v
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。- z8 A* q3 @! f# M( K8 w4 ?7 d7 O2 @
第一种方法:利用循环链表( a5 R& B6 U/ Q/ g
#include<stdio.h>  ^0 Z7 f# a5 e) J+ l
#include<malloc.h>3 e8 U2 {5 Q3 S8 C! E
#define M 8            //共有8只猴子
1 I) q2 H1 Q  N  {1 H- Z+ a; F#define N 3            //数到3只时退出第三只
4 P* l5 A4 P! qtypedef struct monkey
6 [5 b7 ]' G. D2 x9 n7 e{int number;
) U+ T* v! t9 G3 D. E/ ?8 Yint flag;" r; d, W9 W; d0 g
struct monkey* next;! m. @( _' o: e8 t1 p
}MONKEY;
% \1 J+ D; x7 U9 h- @* vmain()/ G: G+ F6 Y, r5 U7 e. a* m
{ MONKEY *head=NULL,*p,*s;% {8 F  ], B  f2 ?+ o) J
  int i,sum=0,count=0;
/ n$ I1 `) L2 ?) f1 W" ^( c9 {  clrscr();              //清屏: o, B, X( |6 L: w# @" t
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存' u( ^* ~) V; I) K+ D9 ~
  p->number=1;p->flag=1;
" s. @, c+ I+ m  p->next=head;' l# l3 d0 O, \% R% ]2 ^
  head=p;# R$ ?  P" m4 Y1 w: ?
  for(i=2;i<=M;i++): ?# m% s1 t1 {' ]! I
    { s=(MONKEY *)malloc(sizeof(MONKEY));7 L0 _6 H; k) F  {
     s->number=i;s->flag=1;
; \$ Z. K" P- ]     s->next=head;5 e1 i8 A6 d! G! l
     p->next=s;p=p->next;
  C8 u' p/ i+ S2 e* {, b    }
% P; _9 P* D! A8 z    p=head;
  R% h0 C! F' r  n3 u. z. \. k   for(;;), ^2 Z) Y5 N' x4 L) X8 R; ?1 O
    {if(p->flag==1)8 p; m# m& F; W# ^+ G- v
       count++;6 w( }" y+ v7 b4 N& q; q% l, Y$ p
     if(count==N): O' }( i  q3 p: |% G+ c
        {p->flag=0;
* S8 l! i4 q8 b) O. A8 H         count=0;
6 g+ f) }" x  i         sum++;}
, b; ~# y7 X9 X# j3 o" i     if(sum==M-1)
1 U8 T% l( F, P( q: Y2 O        break;
4 l) H! t/ _) K     p=p->next;
) b# [+ ?8 E8 X  v' c/ {    }" I1 Z7 k  L% e3 c3 E8 X9 x' O
    p=7 b/ c. o" O2 v& X, k* W( n
    head;
- b' K. Q# H5 q, C1 d& y    for(i=1;i<=M;i++)
" h5 S/ Q5 A  E- s    { if(p->flag==1)# r0 z8 C) {+ P
        printf("\t%d",p->number);8 F2 v  A4 z- W$ ~3 y+ o! e0 s
      p=p->next;+ N+ w& m$ b# C* S. o
    }2 ?$ g7 W/ ?7 M

; _, o+ U& C1 k  r) `. }6 o$ y; s. H4 ^) h9 f1 U$ k

3 G8 s* T# C; Y! q- H2 v}
8 M3 g5 A7 V/ o5 O7 g) Y: p% ?
第二种方法:数组. J# k+ b/ x+ Z- P) }; U
#include<stdio.h>
! K+ X, i9 _/ d7 T: Y3 V! b; B3 F#define M 8
. i6 r3 L! R$ U2 l- ustruct monkey
. `6 {& ^( y& R{int number;) N1 U$ ^9 H# V5 ?3 L
int nextp;
% R5 w, z6 Z4 r) R}link[M+1];9 d8 K6 j: }$ C' A  \7 |

, ?" k8 |  M$ z. c# ]$ e5 yvoid main()
+ @" V) g$ L  p0 x{int i,count,h;  k: A# z0 t7 C# Q! g
for(i=1;i<=M;i++)
. R. q4 E7 }1 _$ B9 l{  if(i==M)
  u) p3 T7 D. B# D! k   link[i].nextp=1;
# y" z& |# ~! U) h" z' q   else1 O: P) D# {, C3 U7 v( u3 P% q
   link[i].nextp=i+1;
5 r- F# b/ ]5 K1 U' }8 m  link[i].number=i;
; Z: `0 q$ _. K3 O}
0 l, u9 B) q& I; [+ ~! Z- Yprintf("\n");% b3 M! `5 j  @  I8 {" F
count=0;; w* d" f. _) C3 j. k
h=M;. H, f6 B4 K" N; P# U' O
printf("依次退出的猴子: \n");
( G. g7 P# p( ~; s( jwhile(count<M-1)
4 d" r0 [+ e. {9 f" X0 Z{i=0;
+ {' \6 U% G7 i5 x$ ~! x1 N( d1 Wwhile(i!=3)
1 {2 t% v: ^! G0 V{ h=link[h].nextp;& b9 E  p3 j- B$ J# K, R- i
   if(link[h].number)
3 \6 ^, E, O! j4 `& I1 U2 A) ~     i++;}& f; t% z' K/ E+ s  z1 @

0 j# x! v+ I& C2 Fprintf("%4d",link[h].number);" Z& l: u7 R) d( R* |+ I4 d7 P+ Y
link[h].number=0;5 ~5 v8 c6 j/ n% i( z
count++;
& t' A- d/ z9 B}6 L  I# t& k! L: Z! ^% Q) C# f

) ?1 `4 u) ?" d, Aprintf("\n大王是:");- ^$ Y8 z& I2 b$ h
  for(i=1;i<=M;i++)* a( d$ ~! j/ B: l2 C; b
  if(link[i].number)" k% s' D+ d8 A+ V
    printf("%3d\n",link[i].number);* @5 x# F: L9 y7 k% }6 F

9 Q0 g" a6 u7 y! D8 Q# I5 R4 X  k5 k
}
& D+ N" c- \2 k9 n% A( s# F
第三种是普通方法for循环

6 ]$ [- W# v( i( q* y. _#include<stdio.h>% y2 v5 V% |$ Z
void main()3 C1 F, ]  R9 W9 Q( `/ B5 P
{ int i,k,m,n,num[50],q,*p;; _: [0 l) m" G" p9 e  `
    clrscr();! p/ r' h3 N  k; d4 F$ ^
   printf("input number of person: n=");
% t- H" Q. o1 f7 v- ^  i    scanf("%d",&n);1 [. B8 R$ E; M! k5 o0 i" X1 |1 `
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只  V& X& \9 A1 b* a* `: h# K
    scanf("%d",&q);' E9 X8 Q  l; y5 U
   p=num;. y' \" V# n  D. P3 i! C
  for(i=0;i<n;i++)
; p9 J" E3 \$ N. @    *(p+i)=i+1;2 q0 {& d# K( u2 h) @
   i=0;: H9 I4 C* B+ N0 I( T: }; n/ {
   k=0;
, Z% f2 ?0 }0 F0 a% j   m=0;
7 ~. |' ^6 R5 I) ~  while(m<n-1)/ L* a/ H7 v* t' S9 v4 w) e
   {if(*(p+i)!=0) k++;
! O+ }% {$ \: q     if(k==q)( e- T! W4 i  \' e% B
      { *(p+i)=0;
- Y3 L% J3 r5 e        k=0;
. A6 l! h+ G% j' ^3 q        m++;
1 L9 [' M& H7 i' t      }
, V6 m6 n, U7 O6 ]. w9 u6 O4 z) q+ \    i++;
+ q4 |) ?) u$ K3 j. C7 B    if(i==n)i=0;" {1 R: X& Y* w2 h. k( H4 b
   }  y1 N3 q1 T* `
  while(*p==0)p++;- D6 f9 r$ m( j! {
    printf("The last one is NO:%d\n",*p);
* l2 I# ^" `# y     getch();1 e: @3 Y7 W- r1 b1 G- O

8 U/ `) f: n1 P9 u7 B}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
, @  x( j* \7 S2 \* Y* Rnamespace 又费马达又费电( e  F  x' q4 r. ~/ D: f2 t$ T
{
- U6 p, f9 ]! c! \! {/ C    class Program* @7 i8 _$ k& g6 c2 j& q$ Q3 d
    {
4 w  y. c% g  l3 m2 S        static void Main(string[] args)7 a! |1 ^6 t3 B
        {
. s3 p& X4 a9 x; Q* B6 T8 m7 Z            int m, n;
1 v4 X) M6 X. A            Console.WriteLine("请输入数组长度");
8 k4 _, D2 @3 y- e2 P  ?3 F" \            m = int.Parse(Console.ReadLine());//m为数组的大小" N* e* g, m" b; y8 G: c
            Console.WriteLine("请输入要截取数字的大小");
, E! M. c$ n  ]  @            n = int.Parse(Console.ReadLine());( E/ h2 \3 v. D: a) V% M
            int [] numw=new int
2 h7 P6 i( v! t) |. D" t4 u
; Q; y! J" o  }' x9 I: j&shy;&shy;&shy;;
9 h! ~* m: f: M( N            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
; U2 L9 H/ w, h8 R, a% P% ?            {
0 v7 k' H# U  j0 G/ Q. q( o                numw[j - 1] = j;" k. Z2 T- Y/ }
            }6 c- y1 K7 W2 m2 z: F
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!& {$ x8 F; O7 o
            while (d != m - 1)
( b) h$ J8 R6 T( o/ T6 g            {& A/ M3 O2 G0 K( K
                if (i == m && d != m - 1)3 `5 p% Y8 W$ s
                {% Z7 o0 D  F8 h* c
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!3 D+ N5 b) d4 }" [- `2 \
                    continue;: X5 I+ k; R6 C% t. {! y2 ^- s1 K
                }8 r) ]3 P6 j) o7 D: _! L) A; l/ Q
                else
8 C8 S/ l/ \% r% a3 C  x                {
5 l1 W, N3 \$ O                    if (numw[i] != 0)8 _2 F" L% M2 `% b4 X
                    {
# J& _3 O) d& Q" j7 p                        i++;
! e8 k1 M8 j' c8 R: p% U2 t                        k++;7 @* p3 W# ]/ J( H* F' f
                        if (k == n)- y" a% g; W( ]
                        {* M5 e3 u- y7 d5 l2 F
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了. r5 ?  Z( X2 t, K3 q
                            k = 0;" H8 o5 b3 I- |% H5 `+ _4 ?
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1. J' D1 V4 [. b5 k
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);' T& J! u+ p2 Q1 l
                        }+ d$ L* v* ]* s1 v; e' [5 V) X* O
                        else//输出暂时还没有改变数组元素的值) ]7 L. z% q: X
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);, W% @" m- [- r0 ]4 S
                    }
8 D7 Q; t& W3 R4 S' N9 y                    else
+ A: g8 }- R- I; G4 ], t4 [6 c                        i++;//数组元素为0,直接跳过,不计数。。。
+ ^. P5 ]* T1 x1 P' W$ a4 _0 S3 ]                }" @8 h1 c# ~6 p7 }0 G
2 ?/ U3 X3 a8 V% c/ R; h4 A" f4 t9 r
3 u6 A8 j. ?) z/ u5 P4 O
            }//结束while循环
$ h2 Z; L/ A- E; O7 ^3 k6 R) M+ t            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
' h- |; j, W# V6 S1 n% V           
$ k6 J1 T% |9 k6 w2 d                if (numw[i] != 0)" e* g+ H6 d- f$ T, V/ y
                    Console.WriteLine(numw[i]);
8 t( t# ]$ L$ z. B/ e           9 G/ g- |) N. Z# T; q. k# o" e  M' [
            Console.ReadLine();% Z3 Y- v6 k  }% Y+ ^
        }
1 f7 b+ z7 \  c, w; b    }
5 C5 O7 R  D2 ^8 @' @( @}
3 [5 i1 U+ ^& C: v
小甲鱼最新课程 -> 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 01:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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