鱼C论坛

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

猴子问题

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

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

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

x
大家好!
3 T3 R, I" b  o这几天我在忙着编一个问题,我用了一种方法编出来!4 Z- P. y) S  Y4 D; k
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
: u; z$ B) n& L4 i9 [注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
* g: a) B* t8 g4 J  E- ~6 g3 \: V. v5 L- r
/ I% c+ C3 g2 W& h
                            题目  e! f$ b# N0 D7 Z6 E% {( ]2 i
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
9 h( A4 G! Y9 X! L+ r& v: K第一种方法:利用循环链表
, E* ]& `  J+ `4 F" l# _#include<stdio.h>7 P2 P, K: w! b: _/ \) C( ~2 @
#include<malloc.h>
5 W+ p" X* D( H& t$ o" Z- K; A#define M 8            //共有8只猴子
# `  i9 q+ T5 r5 _5 Z: U1 R4 D* `9 }#define N 3            //数到3只时退出第三只
% w7 y# D8 ^% G6 Ptypedef struct monkey
, Q  x% B1 H: u! W; ^{int number;! V$ Q' x& B8 a
int flag;
  m5 S8 d  g1 [0 D# L0 F, kstruct monkey* next;
7 |: o; F1 A  M3 X- N! F0 ^}MONKEY;
" u" T+ Q% j) K' s1 N3 n8 imain()) v( P" u1 J* |. \
{ MONKEY *head=NULL,*p,*s;
3 N0 O  V9 x) A9 k8 d% t9 ^8 j  int i,sum=0,count=0;
3 Z2 e5 c! Z( V: p& a  clrscr();              //清屏
. m& D% `* m( }  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存$ p) J8 q7 E( h$ H( w
  p->number=1;p->flag=1;5 `* y: w1 k3 y, k0 W; ~
  p->next=head;
! ]4 w$ A) l& T; r" z# B% f3 q8 J  head=p;
' b+ N7 U; D* v1 q  for(i=2;i<=M;i++)
$ p$ m* R5 C( e6 R9 i    { s=(MONKEY *)malloc(sizeof(MONKEY));
5 @4 {  H5 |9 B0 X  {     s->number=i;s->flag=1;3 |: g9 k* c8 O6 x1 q
     s->next=head;. L. l( h- t5 P0 k6 H) I
     p->next=s;p=p->next;
- `! q- c& [4 S* w& ]    }
. i4 E/ u# @) a1 o* B    p=head;
8 a: L- A& |8 r" I( l# A   for(;;)
8 j; T+ f6 i+ M/ Y    {if(p->flag==1)8 \! \. L% G, |7 l$ s
       count++;) G' Z8 v$ c$ w7 @# ^, N& c
     if(count==N)
4 z4 h) W% k& F2 S8 G+ m& E# I; |        {p->flag=0;$ V' K6 T1 c0 T, ?8 x+ [1 c" i
         count=0;8 _; \8 I% r  _8 {. ?: c% ~
         sum++;}3 V) o2 f: t, K5 T3 t3 m, t! Y
     if(sum==M-1)
2 v3 [+ q. C7 o7 Z2 w        break;
1 H, A8 G1 B7 p* f2 s. [, R4 p) u$ u     p=p->next;
' w) ^6 o0 \& m% Z, ~9 P& j) o' V# Z& P    }5 P0 O4 O) _  E2 f  `
    p=! O, S$ O+ u5 \; H6 T
    head;8 i; d. x$ v% c. i+ ]
    for(i=1;i<=M;i++)0 `7 g9 |/ `: y& h' A& X# ~
    { if(p->flag==1)
" I2 W$ {* U+ q( z        printf("\t%d",p->number);
' u' T  `3 Q5 D( C1 i+ Q8 u$ J      p=p->next;
& `: M& H* p2 q+ R& w/ U6 C1 O    }8 Y  P4 ~3 @3 ^$ Z

7 I: s( N$ u3 ^; G0 m( e8 w
' E1 A0 ?; d" [0 H* a
+ r$ |. W9 v" g4 O2 e3 H}
; D& g# z, k8 ~. D+ [$ x
第二种方法:数组
/ l0 k. s* Z9 u- x3 D#include<stdio.h>4 e  a! L& f3 I7 }9 S# H- L% i
#define M 8! y. N4 e* Q2 g7 r
struct monkey: m/ q. O+ o6 l( b" S0 ^
{int number;
  a" A% w' K" D% hint nextp;- f& `4 v" o3 ~/ I
}link[M+1];# u7 p) @/ d. u+ n

, t; k; g0 r/ F' j- P( k! hvoid main()) J, |4 \% [# E
{int i,count,h;, ?6 U. I- X9 y
for(i=1;i<=M;i++)) e9 M9 Q' V' Q
{  if(i==M)3 L9 a  j7 g5 s( ~& J3 e
   link[i].nextp=1;. y6 ^; Y$ \: {4 l, c5 t+ X1 u
   else
6 Q% D9 j6 y- u) O  N   link[i].nextp=i+1;
1 e( ~: r3 r# D& s* t, Y5 @  link[i].number=i;: C1 r8 f0 g6 b0 V
}9 \! t% l4 c9 q- M# X
printf("\n");8 I" l' D! Y8 [
count=0;
% @6 H& d! I; F# n* \6 T+ A$ Z/ th=M;
/ }8 f6 j. y: O( hprintf("依次退出的猴子: \n");
( M$ D: e* w4 B$ Rwhile(count<M-1): B8 [( s' p% t7 g9 x
{i=0;
5 ~& a/ r) m9 d" X. uwhile(i!=3)
! w+ u( `5 v: i3 R" q9 X{ h=link[h].nextp;/ N" e. Z# P, r. O0 S
   if(link[h].number)
& f+ |9 C/ j7 G8 H4 |8 v3 n+ V* @     i++;}
9 M& d' }4 Z5 h& R& f! L# q# u  j! W
printf("%4d",link[h].number);
# T+ a; H  S; v; }link[h].number=0;
) L! F* p" q8 }, \count++;
( ^- S- Q# {) z1 h/ m6 \5 P4 q}
9 g! p1 _  t9 x* p2 n( G1 H' j- d* }) A. m4 W
printf("\n大王是:");' K; F8 B' Q8 l. D: l
  for(i=1;i<=M;i++)/ F1 b/ v, J/ B
  if(link[i].number)3 W$ l# {5 D* F2 g' x% q7 ]& T# `# @
    printf("%3d\n",link[i].number);  v5 w, ~, k3 q# J% Z: P
! Y* t$ e7 H( C

3 ?& \1 o8 {  D# ]4 _4 g3 ^# [3 i}
- E+ K# o6 W# Q( Y
第三种是普通方法for循环

+ M) c+ S+ H. G8 f- ]$ Q#include<stdio.h>
6 k/ W1 Q) S  Yvoid main()
5 Q/ `4 S7 n" Q6 ]: M{ int i,k,m,n,num[50],q,*p;
) }6 S/ Z& f: y% d& h2 @    clrscr();/ d+ t4 M9 O; ~& g- [% I
   printf("input number of person: n=");
! [, e# K" k8 Z' c: N5 l2 t    scanf("%d",&n);/ `2 y  _1 L3 A7 w+ e( o2 o" M+ f% n* K
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
0 U8 o5 \/ ~6 _* f  y0 W    scanf("%d",&q);1 {, }0 o* y& ~
   p=num;1 [; Z1 a( ]& d  x
  for(i=0;i<n;i++)8 r. ^3 m' x) g' P
    *(p+i)=i+1;& r4 b4 g3 e- ^
   i=0;
7 |0 i) o5 K3 w5 P0 Z: S   k=0;0 d* Z0 J8 Y$ H4 }4 [$ P4 w$ e) k
   m=0;# H$ E: {  H6 b/ Y
  while(m<n-1)% X) R" k1 h0 \8 E" t; N
   {if(*(p+i)!=0) k++;
: X/ u/ U! ^6 N     if(k==q)0 O0 n& f  C3 z% O/ L3 j+ L. N; O: q0 H
      { *(p+i)=0;
5 X& s0 f. V! D: O        k=0;8 h( N2 o$ g* f* `9 \$ H
        m++;
! u3 Y9 g  U1 I8 g5 H      }
3 W$ ^9 G5 O& R9 d$ W- M    i++;
2 R0 j. h' ]( i4 F2 `+ T# P    if(i==n)i=0;
" z$ N4 c* ~4 d" E   }
# o/ D3 C! d  P  y/ n5 `  while(*p==0)p++;
5 I* g; I. D- U( R! F    printf("The last one is NO:%d\n",*p);2 M( _) I- L3 H
     getch();, M, ~8 U/ c, I
3 x. O; A  v3 g; `: l9 [5 {0 N
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;% l: W9 F$ c8 h6 m) o9 x
namespace 又费马达又费电) c1 K- O1 R6 _' N: N, O2 V. x2 s
{- c5 Z! j( ?9 G2 x1 k( Y
    class Program- R; E, x3 s1 o$ }% G
    {) l2 \, L3 b* D* ^
        static void Main(string[] args)
8 L" D  [" f4 p$ t        {0 K! G$ N0 B6 R/ w5 c
            int m, n;, O% ]' J. l7 G; T! s% Z9 A
            Console.WriteLine("请输入数组长度");
* }/ V9 [% J( z9 f% T8 L- R4 K            m = int.Parse(Console.ReadLine());//m为数组的大小9 ]4 L- M5 r  u- f3 H5 y* H/ P
            Console.WriteLine("请输入要截取数字的大小");7 E, N) D' V$ h; C8 X
            n = int.Parse(Console.ReadLine());$ n- i5 G# q3 B# M8 W( N- n" u
            int [] numw=new int
# o% [& d8 |& {  |: w& k  a  R" f. ^7 _/ q. w: @+ b
&shy;&shy;&shy;;
& K3 e) {3 `/ g) J8 c% \            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数# D9 W# l6 k8 y3 p0 Y8 t
            {- C+ b7 d/ f4 X1 U
                numw[j - 1] = j;8 }  u" ]9 B' I, u
            }7 n( o3 k5 C. A5 f+ p8 Y
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
5 j1 e" q( J+ r. {            while (d != m - 1)
/ e0 q% Z8 W! R& V/ r. N: ^            {
: r. g- [. V% E                if (i == m && d != m - 1)% @6 I( G* F3 A4 u
                {
. b& j1 n) q5 n: z                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
! l* U* u8 q. c& p                    continue;. T6 F+ s. `9 V- W4 q( q
                }: k- m+ ?7 V! `9 ]( l- I" s; t% H- _
                else3 ^8 t! Q: n7 `2 M
                {
6 ~( m. l+ X2 S6 z  E0 Q0 p                    if (numw[i] != 0)
8 A' J' K4 G( ?. Y                    {
' L) p1 U9 x5 J, A1 F7 W0 _3 ]                        i++;7 `& i8 g5 M, D; V
                        k++;
8 U/ |- k1 }% H- E                        if (k == n)6 K0 @3 p1 P* }3 I! |  `; l4 P
                        {* t0 `, d& x# @$ t' i- K6 H
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了7 Y1 ~7 s' [  [: U6 p- e$ i
                            k = 0;( ?, T8 o5 b- M
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
( ~2 F- [: i+ e/ H: o+ `                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);- C5 O  ~# v  W4 \/ ]- \: @5 b
                        }, B, j7 r2 Y3 f. G. G
                        else//输出暂时还没有改变数组元素的值
% R: A/ K! A6 d+ G7 X                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
3 B, \7 N8 G5 v; u                    }
" `2 c- A1 B$ u& X# w( B                    else! j+ J1 P% b) i  `7 l! Y
                        i++;//数组元素为0,直接跳过,不计数。。。7 j& h9 m. H: v# g( p' @
                }8 t8 V+ S+ O, w0 p" \
$ n, j% B. X, t! P5 {# p+ I

) n$ T7 v1 j' u8 n/ j            }//结束while循环
- T8 M6 S  m( l# D            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦1 q1 o# [. {/ G, |. Y8 y% ]" ]
           
! h% {, c4 ]" ^7 M                if (numw[i] != 0)
+ {0 e2 Z$ l* g; _6 [                    Console.WriteLine(numw[i]);1 _3 C' N( N( s% B  D2 Y
           0 q& A5 i6 i$ F, \  W8 X' I
            Console.ReadLine();
; U/ \9 d8 ]4 h) n; j7 ?3 K        }
; |# N  F# d8 N( y' S7 C    }
1 s0 x" H- k' S3 R}
) e# @% d6 \$ g& \
小甲鱼最新课程 -> 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-24 21:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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