今天我们要写的是“猴子选大王”,一道经典到不能再经典的C++编程题。
有 n 只猴子围成一圈,从 1 - n 编号,大家决定从中选出一个大王。经过协商,决定选大王的规则为:从编号为1的猴子开始报数,报到 k 的猴子出圈,然后再从下一只开始继续报 1 到 k ……,最后剩下来的那一只就是大王。要求编程从键盘输入 n、k ,输出成为大王的猴子编号。
【输入】
一行两个正整数 n 和 k
【输出】
一行一个正整数,代表猴王的编号
【样例输入】
3 2
【样例输出】
3
题解:
一般人的代码:
#include <stdio.h> int main() { int N; int a[1000]; scanf("%d", &N); int count = 0, number = N; for (int i = 0; i < N; i++) a[i] = i + 1; while (number > 1) { for (int i = 0; i < N; i++) { if (a[i] == 0) continue; count++; if (count == 3) { a[i] = 0; count = 0; number--; } } } for (int i = 0; i < N; i++) if (a[i] != 0) printf("%d", a[i]); return 0; }
高手的代码(多想一会)
#include<iostream> using namespace std; int main() { int n,m,k,r,q; cin>>n>>k; m=n*k; while(n>m) { r=(m-n)%(k-1)l if(r==0) r=k-1; q=(m-n-r)/(k-1); m=k*q+r; } cout<<m; return 0; }
大佬的代码(就是我)
#include<iostream> using namespace std; int main() { int n,k; cin>>n>>k; int i,ans=0; for(i=2;i<=n;i++) ans=(ans+k)%i; cout<<ans+1; return 0; }
有图有真相(注意代码长度)