鱼C论坛

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

猴子问题

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

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

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

x
大家好!9 o4 T( G8 H& a: Y2 P, |: P
这几天我在忙着编一个问题,我用了一种方法编出来!3 A/ i* p1 y' r3 C
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
& t8 |$ _3 m- F2 U/ u$ c注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
9 R- E8 \. h0 o3 O6 `+ N
3 j- M6 W5 ^; c/ J* C& i( C. j3 _8 N
                            题目# z* L$ D4 t& w& d9 z. z6 w9 t
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
7 {& u- a8 j0 Z# }8 h, @第一种方法:利用循环链表
3 t8 J1 Z4 Q! A7 v#include<stdio.h>0 m: ?& o9 z1 ^9 h
#include<malloc.h>
2 z2 l" L5 b. _& p# c5 {#define M 8            //共有8只猴子
% g4 A% G& `5 ~9 [1 x#define N 3            //数到3只时退出第三只
5 q7 {# }8 C0 i  ^2 vtypedef struct monkey
3 x, e; X7 t% Q$ G/ ^+ Y# J6 r1 X{int number;
* m6 F) F/ p1 a1 K" X( aint flag;6 F  Q9 F0 x0 _# D# }
struct monkey* next;
2 g, ]* D3 \# C}MONKEY;
9 G: E+ S/ ~2 E9 T3 l# Z& y% t% p* f( Qmain()' B5 ]* a0 h- T- Y' B' ?4 {2 p7 n
{ MONKEY *head=NULL,*p,*s;  i% _6 m- W2 _; J; o0 J+ [4 |
  int i,sum=0,count=0;
4 V( N( k7 _. F1 R3 Z1 M$ m  clrscr();              //清屏0 j3 A3 _2 l+ y# t0 I" `, e3 N
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
" D7 y' G* ?% M: B' b/ F  p->number=1;p->flag=1;
6 Z' K4 k/ k9 A+ f3 j  p->next=head;6 ]: x7 _/ {1 F* Q8 l; {3 g
  head=p;
/ x2 R8 ?/ b/ J1 [2 P% R: r$ Q" o  for(i=2;i<=M;i++)
7 r, Y  w+ Y; l) e: t7 z- d/ _    { s=(MONKEY *)malloc(sizeof(MONKEY));
; G6 E9 G! k" S' A+ ^     s->number=i;s->flag=1;
* T6 A& f  }* k0 c$ k! f; }     s->next=head;& E1 h$ V! R/ a& Y* i
     p->next=s;p=p->next;
' T: E6 K3 o  x% U! f5 }; ~0 E, _" L    }; t. D: d: v4 Y* o# w8 A
    p=head;0 s  X2 m7 j0 p6 e
   for(;;)) }/ Y0 o: s7 W: V, N2 l
    {if(p->flag==1)
# t5 |3 a# r5 M7 g4 l+ ~- k) a& F$ x' ?       count++;
4 z; Z0 K7 |- w- f     if(count==N)3 s+ g, i& S, n7 e
        {p->flag=0;
8 F6 p  H* p4 `: u% I* f         count=0;1 R0 s! f9 a- H9 b1 D) B1 _
         sum++;}0 x/ ^+ [! N5 Q5 Q8 @, _! ~
     if(sum==M-1)+ q" D3 _& V2 K2 ?
        break;
' G6 r0 \3 D# n$ L$ n$ ]     p=p->next;
3 L$ P$ K% A' D7 l6 `% l    }
' X* k! D; k0 X. i! P0 q    p=
8 t1 p$ f- o# J- W    head;
! Z) E& O. U: p  u  Z    for(i=1;i<=M;i++)9 }! T+ w/ @# p, l! a, ^
    { if(p->flag==1)
) S2 E% @/ a$ }! f: c. c; y5 ]        printf("\t%d",p->number);
* m# G" K. C; x6 ~      p=p->next;
$ ]" f/ \2 a" z    }
& s6 p' v1 Z  [% s* o- U2 ^4 s8 S- Y2 G  ~

/ U( ?; v& ]' o/ E+ A
# y4 Q# ~8 N2 C}

( y1 g0 }" P7 |, C第二种方法:数组5 D  i# U/ r! P! Q  I
#include<stdio.h>- J- {9 W$ T" P' }( i1 G+ L3 u% b
#define M 8
7 m/ X) E* a; H7 O% pstruct monkey6 [% d3 J, {" G  W( Z, z& d
{int number;  Z" j7 N' i& |/ \+ E, p
int nextp;5 C$ H( v4 D4 `8 J
}link[M+1];
! L/ q' m* I7 \; Z; b/ S& t. `( J9 n: c  H4 @  O/ k* {' H
void main()7 B+ z$ G$ M7 ~$ {
{int i,count,h;
& x# \- @, p& n. Ufor(i=1;i<=M;i++)
! E7 D7 |; J4 j% t  @& n{  if(i==M)
8 ~' c8 l$ `& G7 G   link[i].nextp=1;
$ L. B$ ]3 L$ q, \4 k   else: b  ]4 O, w# n# }* i
   link[i].nextp=i+1;- _! T2 E7 D7 Z
  link[i].number=i;$ L( N1 ~/ o$ h1 s2 N+ r, S/ C6 N
}
9 H$ |$ j6 T. [8 D# Z# Oprintf("\n");$ d. M' T3 f  t% E( U. Q
count=0;
# I+ H/ {9 g" Z; w2 oh=M;; `& ^" q. C5 W  X3 O
printf("依次退出的猴子: \n");4 X1 w. Y! z3 x3 O/ @) B+ Z: ~
while(count<M-1)
& l( ~* q- M6 d5 B- v# @5 v5 t{i=0;
2 f3 Q, S2 g& s3 twhile(i!=3)
6 u! s  j; A9 o  a( O. }# u1 q{ h=link[h].nextp;" n0 y5 a: y* V* x' ^/ E: R9 J
   if(link[h].number)* }3 h* Y. _# V+ e' C. h; J; y: h/ y" ~6 K
     i++;}
  t  I% ?1 c5 a! |8 Y: {* m% F; i- t3 _$ o3 s4 q: y+ P! i
printf("%4d",link[h].number);  E. |7 ~8 [* X8 M
link[h].number=0;
8 }2 K! }8 w; n7 s- |9 f/ P; ]count++;
' u" r7 m' n  ?6 u; {}1 G, p  l; e8 D. w! A
* o; p$ D5 C+ u1 d& B
printf("\n大王是:");
) A) r  z9 o; z( S& C/ K1 c+ ^  for(i=1;i<=M;i++)
9 s, g# l' m! k  if(link[i].number)
( `! v3 ]' P1 ~- V/ D    printf("%3d\n",link[i].number);, a1 U+ m2 e8 _, k

+ M( @0 i- q. k" P
  U$ R( c3 d* u}
$ \" T9 A- M% g$ M
第三种是普通方法for循环

- v! J' b+ v6 V; ]4 W#include<stdio.h>: ]& ?: M2 r8 v. f  V
void main()2 O3 m/ ~0 @; [) A; u6 v( N, \, ^
{ int i,k,m,n,num[50],q,*p;
0 M6 Q9 {4 `  n/ ~    clrscr();2 C  v1 B+ x$ {9 ?; [: H' g+ a
   printf("input number of person: n=");
" G1 f# s6 L: c3 ~    scanf("%d",&n);5 {2 ^: O# H& [3 n% s
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只5 _  e8 |2 w. E5 d/ H" V
    scanf("%d",&q);
/ E. L: K. x7 i2 _/ `( ^; N   p=num;7 m) A# E$ F$ M* w- Z" F8 N
  for(i=0;i<n;i++)
% b- H2 t; Y" d' s+ M$ i6 L8 c. x    *(p+i)=i+1;
7 u8 x1 V# r6 {/ p$ N. ?/ b2 }   i=0;
3 k7 j2 e4 H. L" C   k=0;* S( s0 t% N# w) d. W' T) W
   m=0;
6 h1 n7 @0 j& {3 P; ~  while(m<n-1)3 l' r: d2 v0 \' b/ O
   {if(*(p+i)!=0) k++;
9 T9 T  D7 U( P, u$ @+ e. {, u( \     if(k==q). H; d6 o( m$ b& d( t% Q
      { *(p+i)=0;
6 s% m( q* f0 {- }        k=0;
4 `* z0 N) y9 A, G! ]        m++;. d5 X! Q# J# m  P/ {. w
      }
) U  `" o, U* M* A4 t    i++;4 I9 g2 _+ |: l7 X+ {2 P1 Q& d6 z
    if(i==n)i=0;! C+ G* M- N7 n
   }9 `( x# e/ l/ w% _; G( S( J
  while(*p==0)p++;
- d) \6 a7 {) {9 P1 _1 v    printf("The last one is NO:%d\n",*p);& n6 U) V  i) d: l1 [, q
     getch();
; h) [5 t* M' X) G. A
" I' }8 R% o- _, J}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;# ]- U; p+ y; t& z
namespace 又费马达又费电
; o* ]8 y4 O3 z3 A{
9 }$ Y" A& i9 u1 D* K4 m- H    class Program" h, n' I! V+ D5 {: N
    {
! A. t6 M, F* q& J: }. \5 w/ T% D8 e        static void Main(string[] args)) |1 q/ Y: D) o1 Q
        {3 Q! ^: M, j6 f
            int m, n;/ I9 b1 \/ M* Y% z
            Console.WriteLine("请输入数组长度");' C/ N3 `& x: D  g# j2 y
            m = int.Parse(Console.ReadLine());//m为数组的大小
0 ^$ n% ?! D/ {            Console.WriteLine("请输入要截取数字的大小");
" c* d" s! G% k; e$ T$ C1 x            n = int.Parse(Console.ReadLine());
7 h6 ~$ L4 L' w6 b# V# V8 z            int [] numw=new int
5 T8 ]9 P3 S. A. P
# F) L' q( D. v&shy;&shy;&shy;;
) h* \9 d1 g' j5 m- g. H            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数  a5 C  X5 L2 G  E7 a: i
            {
- k4 h- t  }( G1 |; e                numw[j - 1] = j;
! @; ]* ~( a; Y6 t- l            }+ M8 R' [: {& S
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
3 E$ O- T& |( ^4 z1 s, S! M2 C            while (d != m - 1)7 q2 g' y+ ?( U1 Y+ D* @
            {
/ g& y9 d  k( a# r  q                if (i == m && d != m - 1)
# R! v& |9 F, d& l; y( e# [- P                {$ K) F/ n4 Q0 g; O2 {0 n) A* C
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
# m# V! n- h! v                    continue;
9 i& j6 L$ ^  d5 l* @; P) M7 [                }2 P, U& U  k- R0 ^- m8 S
                else
% @7 ?- H0 r9 U4 `) O1 S                {2 v2 }  W; D$ n7 B3 q0 P
                    if (numw[i] != 0)
$ y; z" ]  Y; m! A  z8 B                    {
- |# C( G6 ~- G                        i++;/ N# u* T* d2 G, J# V
                        k++;9 s2 m0 _& }; ?5 Q' n
                        if (k == n)
  `* E5 p; g* U                        {
& d6 e8 X2 v; [                            numw[i - 1] = 0;//把在n位置数组元素的值改变了* k8 p: d$ m0 X
                            k = 0;
' ~- f" P8 E! x) c8 f              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1/ q) T$ t  {& z
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);; Q5 M" f' P$ O" W
                        }
6 }/ u, x& x& f& \                        else//输出暂时还没有改变数组元素的值  K5 l" V5 _% A1 k# r
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);5 T5 ^" F/ A+ Z: `9 ]) g0 B/ J
                    }# j3 o/ M+ e6 |7 g. \5 p
                    else
  n0 ~- [# }" M% Q                        i++;//数组元素为0,直接跳过,不计数。。。1 m: k% H/ G9 m" j& i
                }+ p9 N% c& O% U/ r9 S8 H
6 A0 ~0 {2 t, o- v7 K' ]9 g* K' k

1 u  p- h! i  D3 j! S$ N6 a            }//结束while循环
2 k' Z) O+ |& T' g, U! X( L/ R            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦8 q2 Z7 i3 }+ x
           
+ @" V4 W6 Y) D; d                if (numw[i] != 0)7 I9 T. l  F- a2 o% K" a
                    Console.WriteLine(numw[i]);- a2 D5 H7 `1 y& ~1 A& U4 |  k
           + Y: w- x4 ~8 N& B! V2 d$ h
            Console.ReadLine();# X/ [- V3 t  V) T
        }
' \  g& K1 ]$ r+ ~7 s$ m3 @    }4 Z$ U$ x& _$ R
}
7 ^. U4 H3 s2 ?! a5 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-3 18:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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