鱼C论坛

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

猴子问题

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

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

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

x
大家好!
; S  t( u- I* p: \: e. [! \这几天我在忙着编一个问题,我用了一种方法编出来!$ p9 Y2 N2 A9 v$ D0 N$ Q
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
& Z2 r! P2 V3 o( z注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 5 G- R4 z& Z/ F+ ]

- L/ ], D  U* w2 B0 G& v  u4 D4 ^9 p0 }! @
% G1 i1 Y% @/ \" h
                            题目1 [5 q" `0 a' V' o% Z- W" b
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
8 }# q$ b0 U) o9 u$ m' u6 I! S第一种方法:利用循环链表
- p" e$ y* Z, M% d8 V) o#include<stdio.h>
5 n$ G! v* W2 {  I3 j* G* z! u#include<malloc.h>0 E" U6 Y  h! s2 L) r+ P/ k6 C
#define M 8            //共有8只猴子( @, ?0 E$ w' s8 f( |
#define N 3            //数到3只时退出第三只2 ?4 Q0 E  k) Q3 M
typedef struct monkey
- M5 K! H' {/ v2 _8 L{int number;
/ s7 x% g( ~8 X/ n  a! G6 j9 wint flag;; [. N9 I$ x- R' }
struct monkey* next;0 l: q2 o* Y7 i) c- a# `
}MONKEY;5 w( _/ S# A( G5 ~
main()
. i) ?3 [, @" Z9 t+ u0 X{ MONKEY *head=NULL,*p,*s;7 i8 \$ j: T, I0 F9 K% c
  int i,sum=0,count=0;
. J$ m- z1 W% u( [  clrscr();              //清屏$ o$ q3 e" ?+ }6 o" A: l: i+ F4 f9 {
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
3 M9 z4 U4 Z1 N6 _* Y- e2 J5 K  p->number=1;p->flag=1;9 B$ n$ O2 s  l4 _/ N
  p->next=head;
4 O) m& w% R2 o6 ^: Q0 X  head=p;7 W: C* z0 c, L9 n' o. ^( ~" W: n, o
  for(i=2;i<=M;i++): ]; c: _5 g' [7 V9 `* a/ t
    { s=(MONKEY *)malloc(sizeof(MONKEY));
6 {- X: y1 v" t. r% Z     s->number=i;s->flag=1;
- F1 p1 R+ t3 Q5 e: y9 y( T/ Q1 E; D     s->next=head;
# k# I. i; s) F  ~! L8 A     p->next=s;p=p->next;7 E, d' n1 u, F5 \/ M; \7 H: @! G
    }
0 {6 j1 q9 L2 }4 k8 D: ?4 N    p=head;
$ C* A0 `" D: f0 p, d   for(;;)' `3 v/ K* u+ X9 H. I
    {if(p->flag==1): S; M, w! S2 ?4 I
       count++;
& z2 |0 @; o& J     if(count==N)
) H; x0 H8 G$ B        {p->flag=0;
( Y  T3 ]+ ~3 }- U8 ^. P1 @         count=0;
9 w( \. k/ t# U. i' n* R# X         sum++;}8 k  x5 c$ L; `; v# @
     if(sum==M-1)/ l& p1 r" }- u* l
        break;+ O7 M* J/ s. c6 X. c  C' z
     p=p->next;' X# w! W; A4 v9 K- o9 k$ X- \
    }
0 k/ L1 S' g! T( w$ Y" v( t  h    p=+ r6 j$ m( M/ F( y* n
    head;
7 N8 I8 B9 R2 C& e( u7 T+ s    for(i=1;i<=M;i++)% Z* `9 K, ^8 R9 R1 `
    { if(p->flag==1)
5 Y2 @2 J) l9 g        printf("\t%d",p->number);
% U" m& `( V* q4 d      p=p->next;: G% Q) Y: h- d. `6 _* Z* {7 O2 `
    }* ^% M8 N/ @3 x. @7 {! O4 c. \
, N% [  D$ q/ o) w0 Q
# V. J( k2 a/ c+ Z0 P& F/ C
, c  s, H3 l- i  s9 ]; u
}
) ^: V! D, l" |, O! g% L
第二种方法:数组
' F8 T1 x+ B" F; I#include<stdio.h>1 P& e8 a2 U* ~8 o5 q( b$ T
#define M 87 k2 h9 c- J* Z% P# s# U
struct monkey$ Z  H  G) S$ Y  f, o
{int number;' v/ L8 M, ]4 e5 C4 e
int nextp;
3 Z7 l5 W: C, c* p" d" _4 l$ C1 \}link[M+1];$ i' L7 K, G2 M4 ]6 |! g
7 Q3 @' v4 y/ L  X) h
void main(), Q7 t) |2 c$ r* b  J
{int i,count,h;( N$ [$ U% s7 \9 [' L% k" {
for(i=1;i<=M;i++)1 G) S7 ^9 D& [3 N
{  if(i==M)
: T, V6 \: Q! Z0 s0 }3 M+ P& k! ^   link[i].nextp=1;
. T1 w) B: S0 _   else0 b0 P+ [2 h: Q2 J
   link[i].nextp=i+1;! M8 V' Y( X) M( \8 X
  link[i].number=i;
3 l$ C1 O4 p7 E  L}' M. S1 i: P% G1 p' e! Y
printf("\n");/ }3 y1 f. g6 g* A3 e' u
count=0;) _8 w9 g! i! [+ q, ]& K
h=M;
9 n2 |1 v+ |6 Vprintf("依次退出的猴子: \n");; _/ M8 n. r; m" i
while(count<M-1)
0 B  [" U' o7 ~. M2 g{i=0;* w5 W) Y7 C, x* q
while(i!=3)# b+ v: ~7 l. s" ^* W$ H
{ h=link[h].nextp;/ A  `3 j: F# k# c- L' {) w* K% f
   if(link[h].number)7 Y/ s4 r+ h! F# |* X; T) D
     i++;}( P# g6 \% M9 U7 ~$ w4 _2 M
: u0 M0 C1 \0 Y+ J  K
printf("%4d",link[h].number);+ B- ^: \- B) ^/ l
link[h].number=0;" ]+ ]7 ]. _% \9 G! P. ~
count++;
, Y# M( ?* O2 x! {" W}
! G& z6 W5 p. o" \
8 f; Y! H- S# F* h' \' c. j) Tprintf("\n大王是:");
  M* }4 k: Q: X8 l; `8 Y- T' ~+ n8 J  for(i=1;i<=M;i++)7 V  }  M/ `' r' Q
  if(link[i].number)
! t5 `' o6 _8 F5 q! a( f0 j    printf("%3d\n",link[i].number);
0 k/ ?2 C1 ~$ k
4 u! J$ j/ H9 v& p6 U9 E2 N: }" w+ V  M" r# T
}
5 w+ C( a( O7 `+ ^' x9 ]& p" j3 v
第三种是普通方法for循环

8 o* g; c3 C: \0 \#include<stdio.h>3 N9 N% b! [2 R# F( t, [; t3 F
void main()
7 t3 R3 s  X+ a, c{ int i,k,m,n,num[50],q,*p;
' b% L- H" {. A3 C2 P; P. t( o% Y    clrscr();4 s: c8 {5 j, k' H, S4 v" z
   printf("input number of person: n=");& l* L) ]$ C" g
    scanf("%d",&n);, E) T) M7 y: f2 y- M4 j! _
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
+ J) G5 T/ b3 |* g    scanf("%d",&q);
. a5 [# t3 ]3 c. L9 H5 M! ]   p=num;6 R9 W; i3 E8 ~- H. v
  for(i=0;i<n;i++)+ m/ ]. I0 ]3 _' U( h
    *(p+i)=i+1;# _# Z' a* [. R" I9 |- ]6 e
   i=0;
3 S  {3 _- m! p. g+ k0 q* ]8 w   k=0;7 Y9 ^9 Z( r4 V1 N; V
   m=0;3 r8 `6 ^7 s8 n; p5 h
  while(m<n-1)
. [: Z' S  `: R& q2 U6 q$ `) l   {if(*(p+i)!=0) k++;/ w1 ]5 x9 Y  f
     if(k==q)
: w8 ]$ \1 \$ P2 X      { *(p+i)=0;
8 `/ q$ f: t3 K8 J" O5 h        k=0;
- I/ K2 A& i. e( H        m++;
7 e3 @& w5 s# S" |8 m# M      }  E0 ?. |  _/ R6 o9 S9 B2 r4 A* V
    i++;0 @5 V8 Z; p' G
    if(i==n)i=0;
2 O$ }1 q5 W8 Y1 x8 F. N3 ?) @$ ^* B   }
+ V* S* E# L( \: `3 E, l  while(*p==0)p++;% S! K+ m# B* O0 J8 m7 q- q
    printf("The last one is NO:%d\n",*p);" e- l; y; ?# F2 k" }
     getch();0 Z6 h( X; E$ c+ Q& k+ o" D
3 b6 s% n2 O* [" ~
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
: ?1 g; F( V, c& |3 p  U7 x! |namespace 又费马达又费电
  O/ d* m/ o* R- n) s{
2 ^  D' l! T7 ?5 H$ M3 T    class Program+ o1 `* i# w( i  }
    {  ~5 n% ^; d6 K$ S6 b; [$ g9 g2 e
        static void Main(string[] args)  f. h0 J+ }6 s/ j
        {
2 w/ s% h9 H- p) q7 g  N0 ]  q            int m, n;
7 S2 e8 F( t; v6 ]) e$ u6 V            Console.WriteLine("请输入数组长度");2 u/ q* Z" Q: g" q6 Z& A" A  x
            m = int.Parse(Console.ReadLine());//m为数组的大小* y& t( z! I/ f7 p  ^
            Console.WriteLine("请输入要截取数字的大小");! I/ w9 o: |# Z8 Y' D+ B2 T
            n = int.Parse(Console.ReadLine());
* n/ ^+ E& b) h' f! F            int [] numw=new int
! K; b( W& C& d0 `! u
, I' G/ Y) a+ q# M/ g5 I  P&shy;&shy;&shy;;8 y5 ?2 p, r: g0 N, B+ K
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数; v- p  z4 X; I* {6 f& x" o& q
            {9 H' q6 V! I" a' @7 m4 H
                numw[j - 1] = j;
. I; h  y5 Q* v/ w" O            }
5 r  S  m# O- F5 v  j            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!6 ]: F9 Q! k2 \/ ~4 M' k
            while (d != m - 1); ]: F6 S# n# C; \' B- |
            {7 D& u. g  p2 l% K. I4 E
                if (i == m && d != m - 1)) t" M; i4 m; X7 u1 x% u
                {) V  b9 I8 e  j8 p  H
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
8 }1 o, W' z. S/ f1 r$ b4 e                    continue;$ R" W* p7 y! J! O  Q! q
                }# @0 f% k, s9 E+ y, J' c6 m1 O
                else
" ]8 }6 l, _; |. O                {
' L3 J. U! O2 O4 y                    if (numw[i] != 0)
' i+ v) I0 f' Z+ S: F' P# K                    {) f6 Z& @3 o( T2 \) b4 h
                        i++;
; g0 P2 V' P& b. R7 N0 Z* w, c. o! p) _                        k++;
8 W( W3 c7 N; ^) G% ]9 `  }                        if (k == n)
. ?  r0 c! R/ S4 b/ C9 Y                        {( M+ Z4 ^5 p% h/ K
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
; X  l6 ?/ M7 T" h2 Z1 L/ f1 t                            k = 0;
7 S9 c) D- j1 c% Q  h, `9 `              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
& ]% U3 p9 v3 U1 ~# x% M8 k                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
; k" k) E8 s* Q  |4 ?% y                        }
; o2 O5 K6 @9 l4 c2 I0 ^0 f# I; P                        else//输出暂时还没有改变数组元素的值
0 }, i+ k* L# u                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
1 |9 q/ d, G3 j2 h! O6 w                    }) O! f6 V1 {: ?( X, ~4 V9 k
                    else8 ~# u6 m8 h8 r9 `6 z8 {! t
                        i++;//数组元素为0,直接跳过,不计数。。。" R9 a6 L, ^9 K8 i+ L
                }6 Z* ]! U* M& T2 G. D& o# y

, F0 n% N! [+ W/ K1 x' _7 S+ Q$ t8 f* p  R; ^/ t  i- F( Q
            }//结束while循环0 G1 B5 Q0 ?  e+ `
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦" \1 ?3 G- L5 H3 B# G9 f+ d2 y( D9 A
           6 l' `# N4 x7 a- I+ A  f2 l
                if (numw[i] != 0)
( u6 B8 D5 t8 L8 j% W- Q                    Console.WriteLine(numw[i]);1 N1 z- w6 ~& e: O4 z
           8 \* Q+ g) l4 g3 v7 U
            Console.ReadLine();
( W! }) {* x- L  I! G5 w        }  ?2 M6 J+ O# q$ m! N( r' N
    }
& ?7 E0 F9 p1 p6 w1 @}
8 [7 {" F/ a8 f8 R. A, x* o& @  z3 e2 w
小甲鱼最新课程 -> 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-1-29 17:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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