回复 9楼 lol1234
我想了一下 我觉得我的想法有问题 因为万一要报的数字比猴子数多我的算法就错了。。。 哎。。。只用数组感觉好难做啊
// 猴子选大王问题,用数组来解决 #include<stdio.h> void main() { int temp[100]; int n; // 存放猴子总数(不要大于99) int m; // 报数的最大值 int i; // 循环体计数变量 int out; // 记录出局的猴子数 int count; // 记录当前报数 // 直接录入数据了,没有进行录入检错。。。 fprintf(stdout, "请输入猴子总数:\n"); fscanf(stdin, "%d", &n); fprintf(stdout, "请输入报数最大值:\n"); fscanf(stdin, "%d", &m); // 初始化 for (i = 1; i <= n; i++) // 从temp[1]到temp[n]易理解 { temp[i] = 1; } count = 0; out = 0; // 这是计数过程,最终只剩下一个猴子。 for (i = 1; out != n - 1; i++) { if (n + 1 == i) { // 循环计数的基础 i = 1; } if (1 == temp[i]) { // 查到没出局的猴子,报数加1 count++; } if (count == m) { // 碰到出局猴子,0表示出局,出局数加1,重新报数 temp[i] = 0; out++; count = 0; } } // 输出每个猴子状态,便于验证 for (i = 1; i <= n; i++) { fprintf(stdout, "%-4d", temp[i]); if (i % 10 == 0) { putchar(10); } } putchar(10); // 输出结果 for (i = 1; temp[i] != 1; i++) { } fprintf(stdout, "猴王是第%d只猴子。\n", i); }
#include <stdio.h> int main() { int i,m,n,z,counter=1; int a[50]; printf("输入猴子数n(不大于50)和报数终止数m(不小于2)\n"); scanf("%d%d",&n,&m); z=n; for(i=0;i<n;i++) { a[i]=1; } while(z!=1) { for(i=0;i<n;i++) { if(a[i] != 0) { a[i] = counter++; } if(a[i] == m) { a[i] = 0; counter = 1; z--; break; } } } for(i=0;i<n;i++) { if(a[i]!=0) { printf("猴子大王是第 %d 个\n",i+1); } } }