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

猴子问题

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

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

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

×
大家好!# r# V& y) L% _9 T* I) T0 U1 t- P- U3 Z
这几天我在忙着编一个问题,我用了一种方法编出来!
: \3 i$ A" m. O. [! S' Q但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!' u0 Q5 a# j! [. m& H2 F$ f) m- W
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
' R3 q! w- Q9 q1 Z) P9 o$ k! T3 n7 c0 U7 t% V8 X) M1 h# X; v
; R3 s& N8 J2 ?$ a, J% @
                            题目! v7 {9 {# d6 Z! _( }- I
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。; ~* x: s, m; v4 v3 J
第一种方法:利用循环链表0 ~% J# d; L/ S: A) ?5 j, o
#include<stdio.h>& z' N+ w7 h" f
#include<malloc.h>
% A7 ]: v2 n1 S5 `#define M 8            //共有8只猴子
) i7 _& V4 A1 Q. ~2 O#define N 3            //数到3只时退出第三只# m. k: z" T9 t. T( f
typedef struct monkey
& U1 M+ |, E$ |( w/ G{int number;
# i+ X: ~4 c6 [7 E1 C! Sint flag;
* {2 M! x4 [' a6 l& M/ u+ n' k( pstruct monkey* next;
/ N; j: \, l1 m: h$ {}MONKEY;2 u* {& M1 r$ d  h" x( _2 q% Y& y/ p
main()
9 I  G; l& b9 k{ MONKEY *head=NULL,*p,*s;
, j. s, \- q+ G9 g. ]+ y! ?6 T  int i,sum=0,count=0;& g. O& N+ C) q" y
  clrscr();              //清屏$ w7 F' w) ]- ^+ V! l) ]
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存% T  e5 v( ]9 D$ L* a9 \
  p->number=1;p->flag=1;
3 Q! q* {/ I0 z3 C  p->next=head;: x, [( H3 h3 {
  head=p;
. w8 x7 U% k% k9 i9 y  for(i=2;i<=M;i++)
1 R$ h( M# L; K$ E    { s=(MONKEY *)malloc(sizeof(MONKEY));
5 T+ I' v- h5 ^$ X& Z     s->number=i;s->flag=1;6 W5 h: _$ K  W) J
     s->next=head;4 _8 D8 `/ A0 R; O7 Z
     p->next=s;p=p->next;6 n' O9 z6 M8 j5 v3 s
    }
4 h: a2 u* M1 D0 J    p=head;
; \/ H' i8 y- B! G3 B+ K; [   for(;;)  h/ {2 |1 V' W0 i- `* t
    {if(p->flag==1)% i/ \! S9 d. k) f' g9 k
       count++;9 }9 b5 Q  g1 w/ {0 _9 D! {9 w6 x
     if(count==N)
# s2 k7 ]: d* ?4 c6 H) E. g0 q        {p->flag=0;" Q8 r# P( Y* `# J9 c2 @
         count=0;
" c: z) b5 f: F+ q         sum++;}8 N3 M- g" K! ?$ o6 o" y
     if(sum==M-1)
5 d' W, J& U$ t" S; E; d7 }' a% u9 _        break;
7 c' j* L+ O8 [, t     p=p->next;
, Z1 ~; Y& c- L- S0 s    }
6 D  q$ U$ H( M0 g- x    p=
0 I) A9 a1 B* p( P) R) G    head;
1 t) v4 X% X" ?% `% D" l1 s    for(i=1;i<=M;i++)) b" q0 Y7 P& c
    { if(p->flag==1)' ]8 ~! I' _! x9 k- @" h. ?6 x
        printf("\t%d",p->number);+ \' C' A* r( E- v' y6 I
      p=p->next;
8 _  i7 s1 P% `: ^! I% H7 l+ O( W    }7 y& n6 C) q  o5 P$ z
. w+ Q8 w7 K' }2 i
' B7 y4 W7 b* Q& J
3 y; {; |/ g2 i5 A
}
* c# T5 l- l( u/ E4 N  P# y% L& @
第二种方法:数组
6 J9 I: F, {. c#include<stdio.h>/ J7 |+ B# d" L8 U! U
#define M 8
; ~9 l$ q7 m) r! m0 Astruct monkey
8 _; o9 w6 `) Q; I( K9 z{int number;4 D& \  P5 X% d! f( s+ I
int nextp;, N1 r5 t" t! [: G
}link[M+1];8 }1 H" m5 Y1 I8 W3 V4 C3 d

, k5 A# u: d7 \* q9 ?/ X  cvoid main()% e  p4 }3 }3 d. Q% _. s
{int i,count,h;
: y+ K& `( B) i" d- l1 _7 @, `for(i=1;i<=M;i++)% h% G+ L- V2 F* G
{  if(i==M)5 `3 o) ~5 Z) f1 i% ~$ Q
   link.nextp=1;
/ W. J5 i, ^! L- h   else
7 I4 S) J( e3 p3 `   link.nextp=i+1;- @0 N- f' F0 y, `1 ?- g
  link.number=i;
5 E. U, C# C4 Y9 T5 J$ W0 w}
, a8 M8 n& G5 p( v. G" a. f/ lprintf("\n");
5 q5 f7 l) U) Ocount=0;
6 @5 n! @: c. N2 O* k0 `2 Q: Qh=M;' Q1 S( [8 c3 d9 |$ L+ p
printf("依次退出的猴子: \n");2 D/ O1 q6 x) f2 w% B" z0 F0 V5 X
while(count<M-1)0 T$ z% F! v" g7 G3 E, |
{i=0;, f6 n5 x$ A) b$ [; M; a9 {
while(i!=3)2 X2 E: {, \* w1 D! t$ m6 q- o
{ h=link[h].nextp;+ {! b' z- Z; [! M  v! b8 G/ o. M
   if(link[h].number)
& ?+ q6 G2 i, h( y# e6 O, F     i++;}' ~' q! v/ v' _7 j. h

# f/ D3 E( k7 _$ Hprintf("%4d",link[h].number);3 c1 S& l- K: q' z( F' A# r
link[h].number=0;
$ @1 U+ Z; W1 y$ q6 V# N5 Ccount++;
9 ~; r8 ]* V9 c* x! l6 [}  }  k4 G: x" k6 t0 U

4 N5 u, I, W+ Q, uprintf("\n大王是:");* i! @. O, {' ~' f5 y
  for(i=1;i<=M;i++)8 s7 l$ Y6 h* X5 `0 {# P
  if(link.number)7 p- Y# n" W6 Y  W3 H% h
    printf("%3d\n",link.number);- F! n4 @) j! N* B' @6 r

* ?' q; H# r+ K( G# R
# Y2 F8 T1 R/ u7 w! J}
% q0 y' L3 ]6 w
第三种是普通方法for循环

+ @% O/ E9 p) _' M8 m  a" k+ r; X2 \& }#include<stdio.h>) L7 V1 i2 U) b' t; A5 b. @! [4 X+ h# W
void main()# Z: i  A" Q0 o+ U/ j
{ int i,k,m,n,num[50],q,*p;
* k9 g' [; e- d' x* J    clrscr();
, i9 a" ?; `0 K+ ]   printf("input number of person: n=");
( e4 q: o# N' @    scanf("%d",&n);6 R% a8 S8 c2 p) |7 ^' U
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
9 k! `4 e9 [: p% X6 X    scanf("%d",&q);' r0 ^( P- {) L
   p=num;, [; c( M1 {  m! l" B1 }0 e
  for(i=0;i<n;i++)% x/ d% l7 z* r% Q( m! h- ^- U
    *(p+i)=i+1;
& [. a: B, Q7 B3 K- _% ~   i=0;0 m' D* c9 D+ Y* n$ X% M
   k=0;* K4 A6 W/ c7 g" j; T2 K
   m=0;
& S1 A: f' F" \5 b  while(m<n-1)
# y5 W7 D3 t& _2 G7 P   {if(*(p+i)!=0) k++;, q; I! F5 w8 V& Z1 o  D7 h
     if(k==q)
8 O0 N' j( `; F4 v      { *(p+i)=0;
% d' A5 N& _7 [# Z* ?+ Q' O& ^        k=0;7 l; ^4 f% `7 D, S" J: j  H
        m++;6 C) t* O- Z# ?8 U4 S  Q
      }
7 a9 M: Y' ~- c6 ~    i++;
$ Y6 L/ f, f3 }2 @    if(i==n)i=0;
2 X" E  X0 r8 e. E% D1 O! i- ~   }
& Q" G2 A. U+ c( v  while(*p==0)p++;0 n; Y9 x) [; I% ?* E6 D" [" y
    printf("The last one is NO:%d\n",*p);
& S' Z2 X; O) Y6 R     getch();
2 ^! e& `* H, v$ `6 p
% _4 A) k9 R9 K$ R}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
8 O/ R. R+ e( g) ]! l5 `$ unamespace 又费马达又费电2 w, e% K- K! _, v" U2 d
{2 j( g/ ?5 F. N* r+ ^# G2 F
    class Program
9 _2 n7 Y' d& x* I! l& ^4 ?    {
2 b. E5 ]3 b; H3 w9 \4 u7 I        static void Main(string[] args)4 n- x6 D! Y/ [+ N% `& `5 @
        {5 n0 z5 @& }% R# e# I* {- y
            int m, n;, h- [1 f$ |6 [
            Console.WriteLine("请输入数组长度");
+ o7 @1 t! P3 ]. g3 R. b' @, \            m = int.Parse(Console.ReadLine());//m为数组的大小2 B& p/ U4 ^2 b9 H7 K9 ]1 l
            Console.WriteLine("请输入要截取数字的大小");9 ]7 Q, R' a. K" {
            n = int.Parse(Console.ReadLine());
1 m, o  }1 \) b3 N            int [] numw=new int# e6 W7 ^6 j! ~3 B9 q# {" G$ u

/ V, o6 q/ f8 |* D- t&shy;&shy;&shy;;
0 I2 V* O6 ~9 f+ K3 _            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
7 ~" K9 b+ w; W3 [: t- @# l            {
5 M; t  P, [, c/ n5 p& w/ c, Z                numw[j - 1] = j;) e$ Q7 v5 d% \
            }
8 u; j6 d# L8 l1 j: S4 S4 I( e7 [            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
: K0 O; S. q9 W  M5 N            while (d != m - 1)
: e# T6 e! _1 Y; X' c  T            {
& v7 L+ r( k) A8 J' Q                if (i == m && d != m - 1)
  Q2 C- m4 s: b" V1 `3 K                {
: M5 J8 K& n) k  y+ U& g                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
* O5 d) H" F& k9 d. j; q. ^; w) B                    continue;' @% E# ]* y; q2 L2 h( n' d" N' ]
                }: B7 I7 D+ D8 m% {9 \
                else) C' Q5 f  y6 v: {# p7 }
                {% \2 r0 t3 T, u, {; ~6 u/ r9 z  a
                    if (numw[i] != 0)
( o9 w$ ]' S$ d+ t: T! ~  K                    {% z/ C4 h/ N- c5 ?/ S) Z8 N
                        i++;
; x4 H  h5 v6 q8 l* B* T4 b                        k++;
2 i5 M4 T/ k7 A. B. k' Y2 I* w                        if (k == n)
/ b1 E- X' D1 O& n. w                        {
- N$ o1 Q! P  a+ N0 ^% |; ], q- h                            numw[i - 1] = 0;//把在n位置数组元素的值改变了% ^# c+ \! k& @% G  W8 @
                            k = 0;: R$ m9 u6 o3 ]2 v$ ?
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
% _% l: r; R$ K- ^                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
# o% L3 g/ P! ~7 q2 c                        }( k5 P9 [$ m! [/ V2 i! ~
                        else//输出暂时还没有改变数组元素的值6 z' ^& \! N5 `* [
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);- c# a& K0 e; ]% C, b. N8 a
                    }! f7 F( b( d5 w0 O1 M
                    else: R: r4 v* h( a) p
                        i++;//数组元素为0,直接跳过,不计数。。。3 \& x6 v; J+ t. |4 A# H
                }
5 H( l% z2 r% g/ P ) }# a- t' |( T1 W, M

) }0 @  C- J9 }  j7 u2 y' l            }//结束while循环2 M8 K. M: n5 J
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦% K( o) c4 g& Q5 v8 I
           
' x) o" }" o/ o! t7 B                if (numw[i] != 0)
' a7 a! W- {) ^- W                    Console.WriteLine(numw[i]);: t' ~1 F- ~$ P; b" I  o$ w. D
           # V8 e! T2 T, |# u/ r
            Console.ReadLine();
# x+ y& ~2 N/ @8 ]        }
: V+ e( k. A8 B, K( X1 f* ^; `0 O    }
& J1 f/ s9 I, u$ r2 M1 E}* V! ~( V; [3 E/ S+ n/ Q0 ~% l7 i
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 1 踩 0

使用道具 举报

发表于 2011-12-28 07:02:23 | 显示全部楼层
循环队列。循环链表。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-12-28 07:02:46 | 显示全部楼层
这个题目就是经典的约瑟夫环
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

Archiver|手机版|小黑屋|鱼C工作室 ( 粤ICP备18085999号-1 )

GMT+8, 2026-11-7 07:20

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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