鱼C论坛

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

猴子问题

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

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

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

x
大家好!; K: k# C) m' P+ _5 R
这几天我在忙着编一个问题,我用了一种方法编出来!. s& V6 [+ y4 i+ F
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
0 C* _8 g5 T4 e4 T1 J6 g注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
& R- O: r+ f1 k8 t/ |) C" M/ ]! O* X  K

7 Q; h2 R: |# i: o& R/ j0 Y# h& t) c
                            题目
% e7 a4 C2 e& ]0 r( B/ d, v山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。  Y$ `: q6 L  P' x
第一种方法:利用循环链表
1 F3 g# W& ~0 ]1 y#include<stdio.h>) `4 L! ^! ~, M8 K+ N9 p: b
#include<malloc.h>$ g' d' c( K' B8 @2 t; K
#define M 8            //共有8只猴子1 t8 f) U' B/ m" \9 g. R
#define N 3            //数到3只时退出第三只- V, A* q' C2 |
typedef struct monkey( b) [. r0 p8 X' \) X+ U& T
{int number;
1 }' w0 r5 t7 a+ z& m3 Lint flag;( J& k! Z0 }7 }- s6 ]8 p& ~
struct monkey* next;- t) f1 ^; i+ f% ]1 G7 U- d
}MONKEY;
7 w( n3 Z/ V$ y/ Bmain()
, @$ z  @8 y' d7 c% q$ N6 e' x{ MONKEY *head=NULL,*p,*s;
0 z: q) E! f! T3 z5 i  int i,sum=0,count=0;
$ `4 U6 l7 a5 C) H" D  clrscr();              //清屏
* S9 B. d7 c; k5 r2 B  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
) U* D' C: c& r) e7 Y+ ~/ i  p->number=1;p->flag=1;4 W/ o" \- F* Y' D% C7 d
  p->next=head;
  m! K. G  C* N9 M1 q$ n  head=p;1 y8 K6 x4 J3 \7 q7 H
  for(i=2;i<=M;i++)- g4 p' f+ {* [# q3 l+ k# j, `
    { s=(MONKEY *)malloc(sizeof(MONKEY));" T. m" d3 f5 ~# \
     s->number=i;s->flag=1;
9 ?& [9 M, [+ X     s->next=head;
# {0 `" _' X7 v/ Z9 _6 j8 ^6 d6 L     p->next=s;p=p->next;  l# R- z  [/ V% F+ m% m8 Q" x
    }
) O5 }. [/ u% _% j0 ]- l3 k) v) i    p=head;
( Z7 e/ G+ I3 \. U3 a9 n+ E2 u   for(;;)* D" X0 s$ R0 ]
    {if(p->flag==1)
; m' {3 H+ Y8 a- f       count++;
8 |9 e8 p  P6 f7 z; g  I8 W     if(count==N)
6 r/ v2 w- }6 j+ ?5 K        {p->flag=0;
# k# n7 S4 l3 u) q% P8 K  J1 k% ]2 o         count=0;
7 I# a& I0 d6 a4 @         sum++;}( M: q$ \" N- ?8 i/ p
     if(sum==M-1)
6 ]! ~6 @+ [/ C        break;( h7 \; B2 o/ q9 U( j7 F
     p=p->next;, \& k# Q. U1 V9 R
    }8 T0 c! v! _/ s& \( x/ J4 q8 f
    p=
( ]+ `. v; {* v) x6 A% e- T    head;4 T# t* S* B- L9 A5 Y
    for(i=1;i<=M;i++)
$ |5 Y! f2 M" k$ m* i) m8 L% \! E9 ^* P    { if(p->flag==1)7 b3 H, ^5 T1 X5 K6 ]' d
        printf("\t%d",p->number);7 B: x, a- x2 g, n/ z* H
      p=p->next;2 l- R- _/ `, P  s. y
    }, \* W; T+ c9 H, S9 Q  ^" i7 t/ J. `
1 g- K' h5 q6 H. g  X
" g/ M$ P. M7 l9 l8 E
6 z: R! x+ d! N/ S* D9 H5 |0 H
}

8 V* E6 w4 h  V8 t: ?第二种方法:数组3 L$ R$ o& Q; w) d" b
#include<stdio.h>
* h! s" x* M) l: I#define M 8) B/ \- C8 Y& A- M8 J# |0 h
struct monkey
; K% L" z8 ^, B7 E  D) M{int number;
' d2 `  n1 w' _int nextp;
0 t$ x" M/ d) C7 z% F$ K}link[M+1];+ W2 o% i# s& R. o8 {1 o' R

6 }3 i/ U3 u8 d' x1 W# J# G; a. |1 C; Evoid main()1 S8 ?2 N7 [) @( D. M3 @% G3 _- C
{int i,count,h;- `, Z/ h' ~) a; y
for(i=1;i<=M;i++)
6 e" W% H: ~3 Z- z* z6 ?* N8 M{  if(i==M)5 W$ G! ?9 D& f" b5 J
   link[i].nextp=1;+ r% A$ _+ \3 t5 C9 d6 V* S  \
   else6 ^2 o/ ?$ l& g" L1 |9 R
   link[i].nextp=i+1;# w: g* B/ |5 y/ `
  link[i].number=i;% n2 u* G7 W5 Q# [) g8 `; n
}$ B& c5 Y) k) x- U% |$ M
printf("\n");6 y* `$ i  s5 Z
count=0;
/ i; S  B' T* h3 ~h=M;
! b/ _6 T5 w3 O! _4 Q- l! c# yprintf("依次退出的猴子: \n");
6 B7 ^' v( l2 ^- d7 j  f6 Dwhile(count<M-1)6 m7 ], ]- P* |- u4 `+ H" P' H
{i=0;
* n0 Q4 b, {( y6 L/ V& `' Jwhile(i!=3)
" k. j: I& }) I: d, C{ h=link[h].nextp;
/ P7 B8 W" \, t; ?/ j   if(link[h].number)
$ e* P/ Z$ r! j2 B1 `: ]     i++;}
1 q% b- r5 Z5 C  p( _" s
/ }+ B8 |2 X$ s" yprintf("%4d",link[h].number);& G- s- V6 @: E) E0 e0 C( l
link[h].number=0;3 t( ?" A. p  b- I  f7 u
count++;
' S* M6 i' X' m! R1 E3 ^}0 ^- K, }% k2 M3 U( z; w' ?

; u9 l0 q. d  U4 M3 Oprintf("\n大王是:");
8 V0 I0 h% u4 q6 I# v  for(i=1;i<=M;i++)
9 l. q& e) L( p: F. s* c& Q# [  if(link[i].number)
* {5 R& V  G+ }# ^" H5 Q& S    printf("%3d\n",link[i].number);
  E% G9 r8 a7 \5 ~0 |1 ~, |
# j1 W( ^2 ?; U. _3 Y, f  |) W4 |2 M5 g7 L
}
5 F( c  U8 H9 }' V% ^
第三种是普通方法for循环

% t+ j1 W1 t2 V% I#include<stdio.h>3 T# u# Z/ W5 O. ]! `
void main()
8 \. @( ~  b8 g2 t2 r  X9 n, B1 g0 m{ int i,k,m,n,num[50],q,*p;
* w4 ]& k& `$ H& E+ A    clrscr();% T+ @3 R" L$ ~4 D( `- H$ r
   printf("input number of person: n=");2 Y0 R) Y3 W' _: `. k- X
    scanf("%d",&n);6 @* X' ~" g6 J) [3 A" Q4 {
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
6 }# m+ W1 I6 U  s) J4 {& C    scanf("%d",&q);- K% W6 T' o4 J9 }' Q) r: D0 @
   p=num;
* T- O/ l$ @! M; Z+ M# r" n# ?: @- A  for(i=0;i<n;i++)
+ N  f" w, k7 {. M( E$ [    *(p+i)=i+1;! ~$ r: C$ \0 V5 z& P9 v; }3 J
   i=0;2 Z! D& Z+ T6 R. r2 b* i( A
   k=0;
& \2 z) ^7 t( B   m=0;
1 u& `% `! c4 ]1 v& p6 O  while(m<n-1)
+ a: n' g: Q) z8 \0 b' [   {if(*(p+i)!=0) k++;! ?9 b+ h! g6 q8 o$ [7 f; j
     if(k==q)
- O. m9 H( j( f" F( E      { *(p+i)=0;
- S7 \  x) b, F) s        k=0;( g9 V7 \( Q; y! a1 T
        m++;
7 l2 p# c4 C) [* {* L; k+ Q1 R      }
; f% }% J% p% b1 Q9 F* o, a9 I. s    i++;! B4 |( u$ q) J1 ~. s1 o
    if(i==n)i=0;
5 _! L" k. R/ d" Y: |   }
: |4 M2 t) e# W2 u) ^" o2 P  while(*p==0)p++;
$ t! i! E8 N3 ~) x    printf("The last one is NO:%d\n",*p);" I( m3 }. @5 h4 y; O/ z3 I
     getch();+ v) }2 X  g9 _: A
! G/ s' V* N" I8 f  r: z* R: b
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;) ^+ I# a: D1 W6 ]: ]+ V
namespace 又费马达又费电" |% W, e4 X0 T5 ]; X5 i
{
* @' R7 P/ M8 ^- c" [4 b    class Program
: i* y" t2 N! ^4 R: A$ u5 f    {6 h+ l: q% Y" a1 r( c9 [' S9 s
        static void Main(string[] args)$ \) B) _8 z) \; h- m. `8 E0 _  Q$ S
        {/ z# r0 f7 t! k" W: W3 c) W
            int m, n;( S! v4 `+ h) L" F% n
            Console.WriteLine("请输入数组长度");4 V. M, T5 u# x" T1 {" W
            m = int.Parse(Console.ReadLine());//m为数组的大小
$ h$ G1 F7 [! W2 x+ o9 y' c  X4 Y            Console.WriteLine("请输入要截取数字的大小");
, X  z. U. P5 I# f* q8 ?7 Y            n = int.Parse(Console.ReadLine());
1 q' w1 j( v: D- L) }" Z            int [] numw=new int* ~$ R+ F7 s) C% Z

4 _. h" R$ \# G  j8 A% [&shy;&shy;&shy;;
' K: t- h6 Q' M9 z            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数) {' K6 A) r7 s, E$ ~% H2 Q  }( |
            {" r; @- s, D3 N% @+ l/ A& A3 }
                numw[j - 1] = j;3 ^+ d- f- N3 A; J, B
            }
' T! I. n1 d0 o2 m            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!7 U3 u% `4 \6 v' q
            while (d != m - 1). x0 X/ V! u7 E8 \. x( d
            {& M  `6 M' ~5 K  A% Q
                if (i == m && d != m - 1). ?( B! [5 u# h" ]1 J  j
                {* M' i! Q  n4 w9 ~  W
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!0 Z) e$ F7 ^; x0 h) Y7 p
                    continue;& K7 L8 F$ i. y$ \
                }
* U1 n# f( E  F" v6 a+ Y5 d                else: X# A7 ?: k) x2 M
                {
+ K: y) [& k# L& @6 E8 e                    if (numw[i] != 0)
  W7 W1 w; G- J                    {
0 T& o( X" c5 V3 o4 [# p/ s                        i++;0 {- l8 u) ?8 ~- m. d
                        k++;. Y0 D# a7 G+ k! q( h8 C" M+ z
                        if (k == n)/ o) }# Q9 a$ c
                        {: \/ z; q3 Z! o4 R5 L, m. a
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了) y/ H: t, i; n; q! |
                            k = 0;
: z% C' w0 I9 x  ~$ V- o) m- ~              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小10 `( O# i. m7 ~% k  q
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);" A8 \5 `; ^# }# N+ p( i
                        }
/ }) n( m7 @4 F/ M! c& X                        else//输出暂时还没有改变数组元素的值; p% B6 b! y8 i/ `
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);3 i' G4 v/ [/ h! _
                    }
8 k. P1 @5 s* q- t3 W                    else
, b" e1 M8 K2 j                        i++;//数组元素为0,直接跳过,不计数。。。
- Z8 f2 c8 Q: N                }
% _5 A, V* n4 D6 n) v* K
2 D7 f8 ^3 X: w# a
) z$ w. v/ L; G7 G/ M3 U, P            }//结束while循环4 D2 M, H' J/ ]# Y! u2 c) r
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦  m$ y: A2 l; k4 p
           
$ m( t  s% ?4 r0 g" w! u9 y                if (numw[i] != 0)
) ~. r4 B+ G: g! J6 H                    Console.WriteLine(numw[i]);( v5 p  ?" o2 A
           
# v6 M1 Z; k7 I5 `- y  A* N            Console.ReadLine();
4 C8 O/ d8 r; B9 W8 n# _5 u7 Y9 I        }- r- n! F3 S8 p9 l
    }
2 V9 _5 r4 C6 \+ P8 U1 `* E}' q6 W7 a8 J& U# W2 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-4-17 23:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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