鱼C论坛

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

猴子问题

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

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

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

x
大家好!
$ l4 c! m. h/ e# R这几天我在忙着编一个问题,我用了一种方法编出来!* z' P) r1 Z8 I, b$ ?  \% [+ B& x
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!+ v& ^5 j3 ]( S; ]; x
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
( t& x) H7 |7 Q
5 g: l) R0 X2 [, Y* W" Y, b. ]# N; Y8 y6 c! g7 X, H. |
                            题目1 i9 w. e) o$ K
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。' ?/ a8 V" V( `% V$ p$ T
第一种方法:利用循环链表( ^  T. r% `* W1 J5 m+ x, J; f% x
#include<stdio.h>
) j  k+ S9 Z2 d9 h. q#include<malloc.h>
! N  {* }" ^5 f. ]" [. X#define M 8            //共有8只猴子
5 g9 E$ M. t7 n& O7 l2 {0 O#define N 3            //数到3只时退出第三只
( r: L- b8 s0 h' Ztypedef struct monkey5 w7 z/ z2 ~$ ]& \- A8 F" D/ [
{int number;
" f7 G" L- {# F9 X4 k$ Y8 Iint flag;% d$ F% ?% t! R' z: F
struct monkey* next;
# A, ]  g! Y+ H; M! W2 d2 K}MONKEY;$ Z6 S9 b/ T  @. O% |
main()- F: A7 t: x3 l. F* v0 B5 o
{ MONKEY *head=NULL,*p,*s;5 B( t4 |( Q+ L' l4 B
  int i,sum=0,count=0;) {: T4 ^5 g7 W  m# H4 a  D
  clrscr();              //清屏
- A. w2 H% ?2 n( |) G, T  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存, n4 W3 B" j5 m. ?* r( [8 T
  p->number=1;p->flag=1;8 h( E4 h( o  E
  p->next=head;
  n* K! m1 R" _  head=p;8 ^) |6 {  u/ P% Q4 }; }* w4 k8 P; S
  for(i=2;i<=M;i++)
9 n1 _- S  E( w" C9 e2 P7 p  x% u2 Z    { s=(MONKEY *)malloc(sizeof(MONKEY));
7 |# e) z/ b, @/ ], F3 h     s->number=i;s->flag=1;( Q! a% i7 f9 N) F+ v& G& h6 \
     s->next=head;
4 [: v: p0 f; `3 u* u* P     p->next=s;p=p->next;
( L- ^6 V- V6 D( x    }
$ G5 x9 H+ _' ^' e5 K$ t9 f1 }5 x    p=head;
0 b1 ?2 \/ r. ]% G9 K, D4 v4 W5 w   for(;;). {+ G, q3 A# K+ P& t, N' l/ M
    {if(p->flag==1)
% V- _* p+ b* P- e/ S, W9 v6 K) P       count++;! D- b$ @2 ^  U% Q) F
     if(count==N)
$ |  M5 `, E7 G6 u: g( b        {p->flag=0;' G- D7 |. U5 g& g- R4 f: Z
         count=0;
# w1 a) V8 A& l: Y/ [. W  e1 U         sum++;}8 H' F$ f2 S6 S7 s' U
     if(sum==M-1)
( b6 r& z- d( x. ~0 p# _4 r        break;% p: a+ n' k7 O( r+ D
     p=p->next;8 }8 x3 P" N$ A8 m
    }
" R* c8 ^* _8 [' Z' L" s    p=
* w! W" T  T6 b- f+ D1 M0 l" S    head;$ ]. ?& K: q& u. A6 a; I
    for(i=1;i<=M;i++)" e% d( m6 g' R/ N7 [0 v1 c' a
    { if(p->flag==1)( R; r" i9 J* f' J8 Q
        printf("\t%d",p->number);
( D6 D  k6 n1 T! r0 M! \      p=p->next;
5 j( R1 J) K% Y' m# k    }
3 V, @& N3 K) `- H: i6 ^
) u5 }6 @3 v* T3 n+ n8 ?, u
5 f8 U% Q8 t9 B' _0 m" ]" `/ J& K/ P1 J, R4 E
}

- {: b) {3 M( Y  `" {( }: _" N第二种方法:数组0 i4 d# T, f9 c
#include<stdio.h>( G! E. b# \, U/ f5 T  ^4 ~
#define M 8
  a1 l; ^" H+ {; X0 Kstruct monkey$ P/ G. L$ W: b
{int number;% B4 `# H: I" O% L9 s
int nextp;- n* C9 O3 w1 K+ e  J! ~
}link[M+1];
) A9 F+ w$ {8 c( ?" D
; r% s) W) x2 |8 \4 R. @void main(): d7 D6 J6 E; b7 r
{int i,count,h;6 H8 k! j0 @/ \9 \/ {
for(i=1;i<=M;i++)* `9 J) v8 o5 t( p5 j
{  if(i==M)
& C7 [* v# ]0 y3 k7 _5 F1 r   link[i].nextp=1;. `& u. w- s5 }+ {3 H) ?
   else/ H6 S: l, r# O7 m! @
   link[i].nextp=i+1;! Y& _2 f0 U3 d& w2 l' S
  link[i].number=i;
/ T4 b* S5 o* Q+ G7 i3 S  z& N}
8 L% H; ]- w- r+ X( N: Bprintf("\n");5 |3 {1 o8 Y: \" |1 Y
count=0;+ ^0 R5 Z) g" s
h=M;
. H6 i" Z7 G: S8 j2 E7 jprintf("依次退出的猴子: \n");3 H3 ~- X% ]5 p5 I5 @8 ?  i
while(count<M-1)' z! Z; t1 S' @
{i=0;
0 e/ F8 c7 m2 t5 n+ e; `3 ]& uwhile(i!=3)
% f8 l0 f, z; B6 ]6 K8 {{ h=link[h].nextp;
6 i: b# s. y5 R5 u% X2 Y: r! |   if(link[h].number)
( Y$ r8 I' I; e3 ]7 r9 T0 t     i++;}8 q! S( |. P4 E
9 S+ b. f1 _4 Y6 m( I2 K
printf("%4d",link[h].number);
) j7 w+ m4 ^! @- c# r$ }link[h].number=0;
4 r7 s  P1 a9 o5 r9 Bcount++;
- \: F# C. K. P! |}
. c' F' s( Y& T) b0 l7 m
" w7 }) h' r: E/ Mprintf("\n大王是:");
1 c! n3 @1 w8 n; F! {4 W+ d  for(i=1;i<=M;i++)
! ~- E' L2 z, k0 s9 `  B6 I  if(link[i].number)
( g' s) v& `$ w    printf("%3d\n",link[i].number);, y3 Q0 j( X+ U$ [5 r! \. W8 ]6 u

) b+ j  P. \1 d1 q% ^( m2 _, n9 H9 N) `" Y: S* t6 [/ P9 p
}
5 C( }4 A+ m' U
第三种是普通方法for循环
+ F! \  G) i5 Y1 m
#include<stdio.h>4 h% A* E* A# r2 {; r' \! k- \* F
void main()6 |2 N/ u* i1 q# z9 i0 Q1 X  L
{ int i,k,m,n,num[50],q,*p;
4 P! Q+ E5 {% Q& f    clrscr();
3 d" i3 K& U) @* c, P& R* n   printf("input number of person: n=");
5 W; Q9 N. i# M6 i4 M, w' V    scanf("%d",&n);; V( \3 H% P* R0 M9 q% y
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只8 a1 Q1 u* n6 L
    scanf("%d",&q);
+ ?0 S5 }4 d6 a' ?5 s. e   p=num;$ Z! y7 K2 O( |& N
  for(i=0;i<n;i++)8 E. }, d9 `- q
    *(p+i)=i+1;7 i. u) r8 ^$ n
   i=0;% J; q9 U. U& R7 h6 o9 E8 j
   k=0;
  P7 L( f- y2 b, H   m=0;. f3 c  @3 D# _9 u1 `
  while(m<n-1)
) k$ @/ i/ I$ s: ]0 @# s) W8 [1 H   {if(*(p+i)!=0) k++;
: u; |$ d' ~1 q     if(k==q)/ p5 T  c' s1 l$ Y. |
      { *(p+i)=0;" d3 {4 X' C4 W0 {
        k=0;
; A( }6 {; S; g9 m; y# k( U        m++;
8 Y4 o$ i- M8 O' r      }1 x2 }: |3 Q% Z/ q1 p3 c% `: W& K
    i++;
" [& m# k2 J$ F+ Q4 D    if(i==n)i=0;" }# X& v" S! A% e  Y# Z
   }# x" s' a! }. H9 y
  while(*p==0)p++;+ M+ ]. `" w( m7 E- W
    printf("The last one is NO:%d\n",*p);
% u2 }, f* \3 s% l3 y$ Z, k% o0 g     getch();
+ F# O5 B4 e+ A; f* V+ q: }! l2 e" y6 E: a% N+ }& x5 Z
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;# `+ C! \, U7 w& P  d+ J+ V
namespace 又费马达又费电
$ O0 k8 k4 F- X- A# g: L( p1 Z- Z{
3 i. x" d! w! L& ~" j/ ?  L$ D) [    class Program  u! U5 f+ U. `8 i
    {
9 ]3 Z$ ?" W: m. \4 i/ J        static void Main(string[] args); R% i: L% R$ _' L0 c7 W" A
        {
8 i2 Y4 O* {9 a3 W            int m, n;4 t6 K/ F4 g: G. G) X
            Console.WriteLine("请输入数组长度");, A0 Q! l, N8 [% E# Y; Y$ D7 q
            m = int.Parse(Console.ReadLine());//m为数组的大小% L7 }, I% g; v5 {4 O) z; D: g
            Console.WriteLine("请输入要截取数字的大小");3 g1 P. h# m, T7 w  y: @' t
            n = int.Parse(Console.ReadLine());: ?3 U' b, K, d: E
            int [] numw=new int/ R" _! x$ ?$ B0 C' c

. {. e: X6 A5 P) ?, }5 t$ l&shy;&shy;&shy;;5 w+ j1 O; k7 m3 E! ~9 |' X
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
) ]7 F" H1 a- `& y            {8 P& E( n4 K/ U) u8 W( Q
                numw[j - 1] = j;4 B! [. R/ b2 a8 N! A  V
            }' ?6 b, b1 M. o2 g+ K+ w$ W4 s
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!3 }0 P- H) t2 b6 E/ v2 j
            while (d != m - 1)8 m' v& n3 |, h" D4 a4 a0 u6 x8 F
            {% ]6 h/ ~1 N4 P9 v( Y) \) y: f
                if (i == m && d != m - 1)3 n( k1 a1 Q4 C  b5 l. S
                {
2 N0 N9 f1 N4 ^4 x5 @                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!* D) V8 u- W9 L$ N* Y: c
                    continue;
/ a/ Y" A+ [3 p                }
- l7 a' S8 t; {$ N# U                else
4 n/ O  A+ w0 B! x' M, R                {5 |0 D9 {0 k( i# d6 P7 i
                    if (numw[i] != 0)
( |9 u& J7 z: p' t2 G: x: e                    {- X3 p* i- ]" Z, ~4 @3 @' M
                        i++;
# U8 n- _; T: P1 p                        k++;5 z' h/ K- }% I2 m6 z( ~1 Z" J* l
                        if (k == n): R" A. R* @. W
                        {) `  q; b" P* d' C
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
2 Z) K3 G; v" Y. o                            k = 0;- X* @  D2 U. K4 m: x
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
' m6 M# ]. X* a                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
$ ]) `3 p; m9 w, L0 j- O8 R5 W                        }
. M7 ?) O0 z0 e                        else//输出暂时还没有改变数组元素的值/ v7 L0 i8 J, |4 G
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
2 k/ ]# ]( b" i" }0 K. k. f" u( s1 f                    }
6 o2 ^$ ?: l* s& O/ L6 m  G                    else
( b% C% x; ?, W8 h* E                        i++;//数组元素为0,直接跳过,不计数。。。
" c, m1 {2 A, N6 ?9 s7 i& `                }
: z; \/ W! D. P9 k3 H 6 r* I( {' r. r; c
5 d1 T2 g7 l, J* ~( Q% d
            }//结束while循环
+ S0 Y4 Y" C3 i            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
$ m6 ^3 n) R6 M" J6 ~           
" q2 _! p0 U. i* m! [) ^0 K  @                if (numw[i] != 0)  i0 M+ R" e( b
                    Console.WriteLine(numw[i]);
% n- |$ r$ G" G+ U/ p" P9 ^# S           ) Z" N2 g# F  I7 o
            Console.ReadLine();/ j5 z" _. z( C9 v; |
        }
1 E7 u2 g3 {5 r. `* m2 @2 I; W- x    }! P8 u; Q, J, N& {
}
0 i4 U! g; _5 z
小甲鱼最新课程 -> 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-14 23:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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