鱼C论坛

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

猴子问题

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

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

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

x
大家好!: p8 C9 P: r" Q, B( v7 m
这几天我在忙着编一个问题,我用了一种方法编出来!
/ f  W0 Y# K, n3 j% r, Y但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
7 H9 b* i6 M% h  p注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
0 [4 U/ z- M0 u! t3 @# A9 l( l
1 g( J. b! n6 y' |& E8 b$ L0 f
3 F1 ?9 B7 q) P" j, {; g/ M1 k0 M
                            题目. F; ^& s' R  B. y
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
: c  ]4 |# k. W  e/ }( P第一种方法:利用循环链表
: s" P: Y, T# A8 q4 B#include<stdio.h>! {* s; {2 l, o+ Y8 x
#include<malloc.h>
" ]0 R/ f, x) q#define M 8            //共有8只猴子
, [- K$ L6 j2 ]# H1 F3 U8 K#define N 3            //数到3只时退出第三只
/ l- F; u  a  ]( ~  P. gtypedef struct monkey' t+ D9 a8 k4 h  x
{int number;. ]8 R, m+ j7 x7 x2 C5 B6 W, p
int flag;
! W) {6 k! p0 ostruct monkey* next;/ t- R' \: ~& v6 [- A
}MONKEY;
: G5 D! s/ c/ p7 G8 bmain()
7 K6 V* T! P) S5 ?1 p{ MONKEY *head=NULL,*p,*s;
" @: a+ \3 B8 O' A  int i,sum=0,count=0;
* ]7 ~: h  m  H2 ^, Z# ]# P; Z  clrscr();              //清屏" \8 [9 D" @/ a1 l$ {! ~
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
( ^1 t% o2 Q- w& N  p->number=1;p->flag=1;
$ J  \  D. a7 G  p->next=head;5 ~! f/ u6 c, T2 ?0 g
  head=p;) L, P1 {& b2 u* g* \5 X
  for(i=2;i<=M;i++)8 x* r2 O8 y6 q- Z5 w4 V5 p- }  x" Z
    { s=(MONKEY *)malloc(sizeof(MONKEY));
& f2 k2 y6 Q$ a% p9 }8 {     s->number=i;s->flag=1;
" R# r" c, a7 Y8 {3 k     s->next=head;
) T2 u, K. V/ z) `" ~/ }     p->next=s;p=p->next;
! r+ p' x9 o' }) g    }
" D' J" ]$ a& Q; D' Q% V6 v7 s    p=head;/ h2 J$ F) j3 A' u% Z* i
   for(;;)
: l0 q: ]0 U. _. M$ K    {if(p->flag==1)5 \* F5 ]1 k" U1 E
       count++;* z. m0 {' C$ Q
     if(count==N)
  b. K! B6 h) Q4 j6 ]3 a        {p->flag=0;
8 o9 O  c) {4 ]' A         count=0;
0 N. y7 |8 c( D( U         sum++;}
' B! h/ x% n% u/ w" l' q6 p     if(sum==M-1)1 r9 P/ a! k+ j
        break;
7 W0 M+ U! P" Q! x+ |# v) z0 B; ]$ G     p=p->next;* d) a' {, }( K& }4 i
    }
) {0 Q  \: s# c: H' x( ^) H! G    p=% g6 V$ C  V4 h4 e' J/ L3 j  ^* M
    head;
, S5 I1 @: v) h( h7 z4 K  i    for(i=1;i<=M;i++)
0 W8 M3 n; S8 Z# D    { if(p->flag==1)
. ~$ V# I* P# Z% q9 @. i        printf("\t%d",p->number);
4 u  p% a  A, Y' ]1 h      p=p->next;2 d$ q6 a1 I  a7 @' E4 C& t8 D
    }9 [$ \* Q$ ^8 G* f8 K8 W
. R( V5 M* P5 n9 h: T
3 [3 w( F' N1 K4 R& ^

4 k  w! T4 o3 k/ q7 J9 H0 Q! r}
2 _- y; B. p+ k2 e8 \3 |
第二种方法:数组
% o  d7 \0 w* F" c4 Q! d#include<stdio.h>( M; Q) y5 c/ B6 ]$ H  d: B
#define M 8
) V8 T9 b5 p8 |  Vstruct monkey" w+ [" ?4 F# y) d7 |* C
{int number;" I- `! i+ y( S- Y5 q
int nextp;! w% [9 Z3 R2 p% ^: H9 |
}link[M+1];( F& t( A+ V+ ^4 W/ ^. _7 ~
1 Q1 U0 p; H& t
void main()
8 k& v% X5 V. J+ S7 p& T0 W{int i,count,h;
) j6 C/ Y# I7 l- X( V+ R/ P+ xfor(i=1;i<=M;i++)- j% @  z3 M+ Q# r
{  if(i==M)0 U1 M. z% p+ ]- h; V
   link[i].nextp=1;
5 t( i: [; Q1 A: p0 G4 t9 k. n   else3 g2 |% M5 G6 N
   link[i].nextp=i+1;
4 i; [' W! `6 ]; o$ f  link[i].number=i;
; C. k- w, q( W) S. {}
3 @" m9 i( W4 M5 w* fprintf("\n");
% D' k: H9 Y+ w; t5 j* s" o# ocount=0;
7 K4 L3 [! j9 o' }% R2 q5 Fh=M;0 b+ C5 E7 r$ t: C
printf("依次退出的猴子: \n");
1 k, {. L+ R6 F; y1 ?while(count<M-1)
) D3 @, ^7 e$ F6 l) h{i=0;
& I8 l# ]3 G9 P  q! R6 P5 Y5 r8 Swhile(i!=3)
$ c6 G( g# {6 _/ n; i+ S{ h=link[h].nextp;% y% `* ]3 C1 x) a  K! y
   if(link[h].number)# x' U' ~, ?7 f$ K
     i++;}/ m4 ^% u$ i# R& s/ g' w
# Q8 H* b/ e7 a* d5 W& a
printf("%4d",link[h].number);6 x7 x8 {' t; D
link[h].number=0;( f; J% D  @9 r) ?& Z  k
count++;- u, w9 b' T) i: }3 E. ^6 g9 |
}5 P8 _: C4 Y1 x6 C

: c% d, ]+ v+ v3 b# @7 w! I0 Iprintf("\n大王是:");  d' P' p' Y1 q
  for(i=1;i<=M;i++)+ R  k# R4 b! g1 T
  if(link[i].number)
& p! z! L% Y9 S, z* b+ x  W9 p1 x    printf("%3d\n",link[i].number);
3 L  o9 G. G2 M1 }0 B
# K1 r$ ^8 {) }2 e- ^
1 _6 x5 C+ J" z" j) L}

( J5 Z6 W# V+ h% `' M  D) v第三种是普通方法for循环
, e% X$ i5 }2 p- \2 \+ l
#include<stdio.h>
" X# `. Y" \" P  E3 G1 f& Jvoid main()
- W' K) t  ?' m; @' {6 a{ int i,k,m,n,num[50],q,*p;8 x" s, d9 Y9 A. M; ?, R/ \
    clrscr();! N' x# h. z. F4 }3 Q; `% l
   printf("input number of person: n=");
$ m9 {  p5 b, Y% ~8 c) K    scanf("%d",&n);& y" Q! D. a- Y/ V
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只+ E4 Q7 Z1 @( x
    scanf("%d",&q);/ v+ L3 S" Z2 O* Z% S4 Y+ s
   p=num;0 \# l- V  ]% x. q
  for(i=0;i<n;i++)
  C: m, s; m; {1 B( f" i0 ]    *(p+i)=i+1;
$ K, A7 x0 l( i/ H   i=0;5 u. }* u: _: I: F: T  \1 }0 Y1 l9 Z
   k=0;
: k0 D6 e( A- `0 l5 V   m=0;
" U; @6 n* D9 r  while(m<n-1)
" E+ c& E$ U$ P8 |! J   {if(*(p+i)!=0) k++;
" y/ h, x" V8 O! P, ^; C     if(k==q)& K3 C  w7 L% E2 A& x! `
      { *(p+i)=0;: u+ j% o  a3 Z2 V2 E
        k=0;+ ~* L9 Z/ i( ]- D" l. e2 y) u
        m++;
( D% x% K( G6 F) z7 D0 x; ]      }
5 P7 s) @1 `1 T" ^, k/ i/ m1 _    i++;% O. H) y' F! h& h7 E) K* }# K
    if(i==n)i=0;
6 I# `9 z7 ?7 D; \6 r, F7 `   }8 r# f8 K/ {! |( T# b
  while(*p==0)p++;
8 Q) i2 i2 c4 x: B' ?# [    printf("The last one is NO:%d\n",*p);
5 e! P3 x0 G- F1 r8 O/ o7 B. l     getch();8 m& o' q& U9 Y- p0 t; C
! j. B; @! d0 C9 [
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
0 ?0 ^( F+ J" a5 A6 S2 d+ Onamespace 又费马达又费电
- v) }" _3 N6 E{
( L- \; f" t# h# r3 C9 \    class Program/ _' d; b& N8 B% B4 K/ G
    {# ^3 M$ r* z2 z
        static void Main(string[] args)
; C: y! l( ^2 ~4 L& y        {& ?( z/ i  X; `: n# ~
            int m, n;
7 M$ G0 Q$ ~" J; \# V6 J- t            Console.WriteLine("请输入数组长度");/ j% i' Y1 s( R& D0 [/ D
            m = int.Parse(Console.ReadLine());//m为数组的大小) [) ]* n! ^  J1 `
            Console.WriteLine("请输入要截取数字的大小");6 {) M! `/ f5 ~, b. a1 Z/ h
            n = int.Parse(Console.ReadLine());
$ Z- M7 g6 I% j+ C. [            int [] numw=new int
7 Q: `4 j0 I' P
4 `  I- P0 J- u: B&shy;&shy;&shy;;# U" V: ^) w# `" `6 [& u
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
1 o9 F+ R* a+ n' A$ j            {
! n9 ?, [: n& k$ Y7 |$ Z# z. R                numw[j - 1] = j;# Z- ?. |3 u. ^0 K, @
            }
$ U9 W5 {3 Y% [& {5 ~; a  \            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!) ?6 H' E: t0 K4 R5 z
            while (d != m - 1)
9 A2 u9 l3 g3 ~/ V- m% u, d            {5 M$ J. \  I8 W1 w" \" W' V5 }- Q
                if (i == m && d != m - 1)
/ c6 s" X& D* {) j                {
4 l8 e" {# F; F( z+ \9 a7 r' K) e8 ^                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
' X0 ]9 u- x$ |0 M1 h                    continue;. p, B9 ^/ S% `5 S6 v. W% d) L
                }% @9 K" d% I1 O- V, V
                else& u1 Y- [  g5 z/ W6 s( d) X
                {# y8 Q3 x+ S$ u0 D4 m% x  P0 y
                    if (numw[i] != 0)
4 ~8 G& V5 `  l                    {: W9 F; ]( W4 x( N
                        i++;; x6 c/ D% T/ j* H; {0 b' n1 Q! s
                        k++;
4 l$ C0 a3 Z6 J+ m                        if (k == n)$ l6 j' W7 C  a, G: |( m+ z
                        {
) E! H) j: \7 z$ }3 ~- P                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
% j7 m" ]4 ?) i: A                            k = 0;
7 w' a$ l2 T) r* n8 a- e              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
. ^: w6 g! T0 a! V5 }                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
5 v% Q: D8 u* r7 {9 F                        }0 d" d6 o8 o: M; f; E
                        else//输出暂时还没有改变数组元素的值
, e/ ^# }3 h# E0 k; |! y                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);# ?* V( y- ~: i
                    }
) @1 b, |  C& z; o                    else
5 {) h2 L( G$ @( y' x. ~* w" E. Y5 R                        i++;//数组元素为0,直接跳过,不计数。。。
; `! t3 g3 |: a8 P& N+ x! O                }. F% K  s, r' _3 z
9 S% ^  H1 F, f- S

9 v1 j9 @* |: e/ G5 }& O7 l            }//结束while循环
( k7 ?7 N7 \, {: {            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦3 T- F. F7 ?2 x$ ~, G4 ~5 t3 ^
           4 E4 B8 F7 S- R) I
                if (numw[i] != 0)
; M! P# a1 A% v2 {, D4 D                    Console.WriteLine(numw[i]);5 j" V3 v  T0 ^3 z2 k
           " P! M& ]/ S2 n' h1 T) s- R; N" f
            Console.ReadLine();
8 M" d+ k# s/ k! ]; r) I5 q' f        }6 R- B( D0 l; D7 N. m9 o( d( I  j3 j
    }8 C* x2 d! K5 d0 G6 a, x* E
}
+ S  }* M1 Y+ @6 F( [0 ?1 P+ u1 y
小甲鱼最新课程 -> 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-9-19 07:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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