鱼C论坛

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

猴子问题

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

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

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

x
大家好!/ T9 B7 U- V6 d( x5 J% u4 b+ `
这几天我在忙着编一个问题,我用了一种方法编出来!; A# f* n, c& X9 j, s; L
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!% b! R4 s  c3 b! W$ N. V* v& U
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
0 E* q8 u3 j: o7 ?; }4 `
$ D5 ]( u! q6 _6 K
: S. S* L. T% D5 q- T1 p: g' C
                            题目
. J6 a" B3 y0 e6 [0 B山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
5 H% ~; q7 I) w' y5 D第一种方法:利用循环链表
# L+ v! p4 x6 Y! Z/ P9 l2 x& V. A#include<stdio.h>. r# U) u- F4 ]4 g; p
#include<malloc.h>
, L3 Q: e" ?! a) Z2 p9 N$ I9 Z1 G#define M 8            //共有8只猴子
4 t% f/ v5 f) }( \3 G4 [3 d; }+ ~5 H#define N 3            //数到3只时退出第三只
; Q7 o6 k+ t$ O8 l3 xtypedef struct monkey2 V- z7 I. f) K5 K
{int number;
0 B/ Y6 ^: P: ^0 i" S8 E" X' f8 C# {int flag;
  W- J- u  n9 |4 L% Xstruct monkey* next;
3 W3 h. B+ _# |3 I/ |}MONKEY;
/ Z/ |; Y. q/ omain()
0 `9 n' @- _% V: ]7 v! Z{ MONKEY *head=NULL,*p,*s;6 O. \7 t' f! p1 F
  int i,sum=0,count=0;
5 m( `0 x7 o8 R8 J( z. k: @  clrscr();              //清屏
" d. s. |7 }% v  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存) |% u  U' l0 o) Q% [% P! m7 f# L
  p->number=1;p->flag=1;+ N' i( {. K9 ~8 k) k6 }% v
  p->next=head;
' T8 C$ L6 c9 m  head=p;
6 C' @2 h4 J0 P1 j; p  for(i=2;i<=M;i++)
/ g' X% b& u, N2 z# G8 G' m    { s=(MONKEY *)malloc(sizeof(MONKEY));
& Z" y9 `' [) F5 _5 t( L6 C  c     s->number=i;s->flag=1;
4 F2 `4 x# s+ f, W, `4 o     s->next=head;! T1 ?5 \5 }4 ?
     p->next=s;p=p->next;* m! b& n. k; ]( B+ G; a) _; J: T
    }# Q4 a) Z- X5 z' j5 _
    p=head;
% c6 |3 c4 K% c# Q& M6 c" J, x   for(;;)
  u" p* F  J6 }9 Z7 f1 z. Z0 c    {if(p->flag==1)0 j/ B) [3 m' g# g; H
       count++;
# J5 I) X% A. h. ~" ^     if(count==N)
+ M  q; c4 J8 S! ^1 u        {p->flag=0;2 O1 ^5 `: S3 s% w' k# c" l
         count=0;
. `) e3 A. H6 n5 d  o1 P/ Z         sum++;}
4 x# C, k0 G. ^& `+ k4 [2 e# y     if(sum==M-1)
* p! r: r, V3 U- e! B' M+ `        break;
/ R( M  a4 B, \) L& L     p=p->next;1 f$ Y; [* T6 D1 T8 b; I
    }
' ^3 R( |& [; O# x    p=) \# }5 x4 P" f# q) U$ ?
    head;9 w9 @, k* @! S5 o/ N" G  p) d/ w
    for(i=1;i<=M;i++)' P6 q5 H* A3 V  _+ s
    { if(p->flag==1): y  {* V: C- e+ F- L; A
        printf("\t%d",p->number);( {, c8 F# _. ?4 g" i7 C# |$ q5 z
      p=p->next;- Z9 o3 q6 T; @% s' v0 {
    }4 h9 e8 ~/ F2 Y+ C( w5 ?

& k0 I0 d& M9 H$ m$ J* X
/ w' K& m$ Q$ {4 e8 W$ ~6 {4 d) a. A; [' J% d
}

. f) u  t5 _* z第二种方法:数组) e" Q' Q0 M. f, o, ^4 Q, E+ Y
#include<stdio.h>
& W' V" S) F5 R: f$ L8 b( X#define M 8, j  p+ q/ P; h9 G1 v
struct monkey
0 k6 z1 J1 }1 I. h- }{int number;
  t1 Z* z6 N& Cint nextp;
$ T9 v: l) G; i/ V: u8 v* M% D}link[M+1];, @. }( X' q( \/ N- ^: l3 j+ Z
! N& n8 n* }8 p
void main()" s! X% R) _6 z/ m
{int i,count,h;
/ _$ g/ r. ~. {+ Z" t% xfor(i=1;i<=M;i++)
6 u  a0 E& j  k{  if(i==M)
# x# w. h# d' i2 J, a   link[i].nextp=1;
* P: g( s, D2 l* h2 c* G+ I   else6 B2 u8 S  U; X1 @9 J% p& B2 r
   link[i].nextp=i+1;
/ ]- `0 }4 X2 f8 e1 ]6 K  link[i].number=i;& j( y; s" `: v! p
}
& q' {: E6 F2 i4 fprintf("\n");5 b- l$ A+ \2 k. H2 Z
count=0;
4 r7 |  j0 i! a3 t6 gh=M;
1 }  g7 d9 S% h4 x9 W+ Dprintf("依次退出的猴子: \n");7 x- l* p* u1 N; ]& F$ k
while(count<M-1)
6 D+ X% k! G/ r{i=0;
0 e( W8 w' p5 R5 kwhile(i!=3)
0 t: u4 ]( N$ ?{ h=link[h].nextp;( O7 F# J. \3 Z' P
   if(link[h].number). x. `, P" A& {
     i++;}' z2 w9 j" \1 \! Y# S6 \. x: `
: m1 z; `9 Z" u. q
printf("%4d",link[h].number);
# y$ u% G) {# Q$ y" R( _& f: ^1 klink[h].number=0;
8 Q0 g8 j( [9 ]8 H) g% s6 Zcount++;
: F. B3 M  B( V9 t}! ]& K0 j* m8 k1 L
( T% t/ W2 m$ m7 Q' h7 H- t
printf("\n大王是:");8 O# \4 ~$ q; F1 `$ d/ q  k
  for(i=1;i<=M;i++)
7 C+ O5 K4 k' L: Z/ N  if(link[i].number), Q! Q, Z  ?  _
    printf("%3d\n",link[i].number);
1 s/ o$ B: D1 _; [; ~& B( V6 V5 C: b& v

8 \  B. n( \( H& E+ T}

7 @$ \1 I# V+ x$ ?- a- t第三种是普通方法for循环
1 j7 Q& I" F! Q9 m
#include<stdio.h>
, f) Q3 V9 ^3 N7 N0 Hvoid main()0 x! k9 |, t& L3 |5 E
{ int i,k,m,n,num[50],q,*p;) n& \+ P1 j4 Y
    clrscr();0 T. k; n) U! y- T/ P
   printf("input number of person: n=");
( u) S8 P$ W% b    scanf("%d",&n);
" j$ b  E5 v) U" {1 J" fprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只4 R3 p7 ?# O! x8 x8 B. r5 b. O2 t' E# ~
    scanf("%d",&q);# r  e) O5 [: G
   p=num;  I" l1 H* I( n/ M
  for(i=0;i<n;i++)  B: b( U$ O. y* k. \' E* W
    *(p+i)=i+1;1 }, ~0 I: G, M
   i=0;8 J- {8 X& O$ V2 i: A/ v' b
   k=0;% i9 x& f% g$ f0 X& @* w
   m=0;4 t/ l# `1 O- k/ Z% M4 s0 v0 }
  while(m<n-1)8 m2 M, r0 m% i1 j2 w
   {if(*(p+i)!=0) k++;
8 u3 q9 _0 D3 P: `6 o/ q     if(k==q). Q6 }3 y" J( G: E/ c( H' B
      { *(p+i)=0;
& d% D7 N+ `# j( e0 r        k=0;
' M' U8 v. \" |) @: _" I- f7 a  ^        m++;
: Q& w3 T0 ?, p% x& l! V6 a, E/ p      }
% T& G, H, L. x8 }( T8 E* @    i++;9 N% P) A" Z: u0 Y
    if(i==n)i=0;
- Y; J$ ^( E- J( v. p' w# Z   }  Q1 _3 ?- Q# p+ d2 Z
  while(*p==0)p++;' c  |3 Z2 V8 V
    printf("The last one is NO:%d\n",*p);
) n* R! A% b" Q- x" F, I     getch();
- f" x9 }  |0 u, m8 }% C2 i  x& U% s. o
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;6 \7 k% t, H! _1 R: N3 s
namespace 又费马达又费电
4 E+ }3 K7 T) f; m! V- t{
. h7 r2 |2 J  O- F    class Program0 O. R$ l1 f7 C
    {- w& C$ o' s, s, S% x
        static void Main(string[] args)
/ Z0 _5 C0 ?- Z" `, m% U, {        {
9 N3 t. E6 N  q3 ^            int m, n;4 K! y$ a0 v0 R% M; Y6 w
            Console.WriteLine("请输入数组长度");
9 l% }5 _# q1 ~2 A+ d' _+ u            m = int.Parse(Console.ReadLine());//m为数组的大小! S" N' F( F0 r% J1 y, {  [
            Console.WriteLine("请输入要截取数字的大小");
0 \( n5 }' ]: ?            n = int.Parse(Console.ReadLine());$ U% h4 Z& g# R* m" _
            int [] numw=new int
  S3 @6 q% }# L  I' ]0 q/ S. ~2 M1 ^( o+ p
&shy;&shy;&shy;;  P8 j( H- o5 R3 y9 j: W
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
! g7 m0 q1 u0 J2 ^            {
8 ^$ ^. [6 X$ n+ o1 l. q                numw[j - 1] = j;
: c3 x/ i4 X  S+ l. `  p            }
; K9 C; p# x- G            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!5 B8 E- H, ?* L$ |. W4 a1 ^
            while (d != m - 1)
  m4 [: `6 x# h) N" h            {
" F* J* i* b, b, J2 A4 R3 D5 c" ]: J                if (i == m && d != m - 1)
/ N6 \4 S3 L0 `: V                {
. _8 ?8 E9 F; U9 t) I8 r3 Q                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!% [, z0 r- p  C9 O7 E% y
                    continue;
: u4 O$ r+ e3 {6 z" n& ]0 H                }
$ {% J0 q4 P8 _( z% O2 G( h( U                else
, u' v+ E% ~3 S/ J9 h                {
8 |, [2 [% U4 s3 u! s% d- G                    if (numw[i] != 0)+ ^2 I- K8 I5 n2 P2 L$ i
                    {
6 y1 \2 W+ _& c* j" W6 t/ L1 H                        i++;! x  M/ `0 W6 ^6 z  v" V
                        k++;2 @' n9 I- L& q5 ~
                        if (k == n); g! {/ Y) u6 k+ [7 h/ j
                        {. M! s6 u* l* k1 m$ m9 e# P
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
; N+ l0 {! G7 S                            k = 0;
6 D( w) G: H- [$ q/ b  \              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
3 ~1 l, e4 q  C4 n3 l" l( F                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);, i% G) r! v" a7 t6 D
                        }4 w2 G8 y1 B  s" E5 [: `
                        else//输出暂时还没有改变数组元素的值& T4 H% ^, W. Z3 d! L
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);  }  s: B8 {1 O+ j. b: ]
                    }
2 I( F/ @, l, C3 ^( o& R                    else
6 \5 u, x) ?) b) j, j                        i++;//数组元素为0,直接跳过,不计数。。。8 m4 e4 |8 R. N8 P9 h7 b% V
                }
# D9 m/ V' L5 P / f3 k! v, H5 q4 \( R
7 M& d8 T3 K* m
            }//结束while循环
, |% Q7 Z; _/ z# @- J            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
5 B6 U/ b+ ~- j           
7 w. D9 G: ~) @1 j                if (numw[i] != 0)( a7 W6 i& q; d7 _; n+ W6 C$ K
                    Console.WriteLine(numw[i]);2 x* e9 A. `9 {  q
           : U. ~) j3 J- X6 B2 ]
            Console.ReadLine();% Q5 n4 Q/ V7 Z) ~4 l# Z
        }
" M4 L! H9 C$ ?    }
- l% @& f4 r# {' z9 L}
# p- C- l# A. v$ O5 D# k' P
小甲鱼最新课程 -> 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-2-6 03:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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