绕圆圈
题面描述:
小明报名参加了趣味运动会,运动会游戏规则如下:在一个环形跑道上,等距离
放置着 N 个小球,小球按照顺时针方向从起点开始依次编号为 1 到 N,在最短
时间内取走放在跑道上尽可能多小球的选手获胜。举办方要求每个选手只能按照
顺时针方向,跳过 M-1 个号码取后走下一个小球。如当 N=5、 M=3 时,小明能
够取走所有的小球,取走的顺序依次为 1->4->2->5->3。当 N=6、 M=2 时,小明
只能取走 3 个小球 1->3->5。小明想知道在一场比赛中他最多能取走多少小球,
当然,小明是知道怎么做的,但是他忙着补作业,所以这个简单的问题就交(shuai
guo)给你了。
输入数据:
输入数据的第一行为一个整数 T,表示有 T 组测试样例。每组样例为单独的一
行,包括两个整数 N 和 M。
输出数据:
对每一组输入数据,输出一行结果 “Case #id: M”,表示第 id 组数据的结果是 M,
id 从 1 开始。
样例输入:
3
5 3
6 2
10 6
样例输出:
Case #1: 5
Case #2: 3
Case #3: 5
解题思路:
通过例举多个数据,发现结果就是用两个数的最小公倍数除以第二个
代码如下:
#include <iostream>
using namespace std;
int CommenDivisor(int x, int y);
int OneOut(int x, int y);
int main() {
int nId = 0; //存放输入组数
int m;
int n;
int nOut[100] = { 0 };
int *pInt = nOut; //存放输出结果
cin >> nId;
for (int i = 0; i < nId; i++)
{
cin >> m >> n;
pInt[i] = OneOut(m, n);
}
for (int i = 0; i < nId; i++)
cout << "Case #"<<(i+1)<<":"<<pInt[i] << endl;
system("pause");
return 0;
}
int OneOut(int x, int y) {
int nOut;
int nCommenDivisor = CommenDivisor(x, y);
nOut = (x) / nCommenDivisor; //最小公倍数为计算公式为 :x*y/最大公约数
return nOut; //求得取球次数
}
int CommenDivisor(int x, int y) { //求最大公约数
int z = y; //本应该考虑x,y哪个数大,用大数除以小数
while (x%y != 0) //余数为零表示为倍数关系,不为零表示互质
{
z = x%y;
x = y;
y = z;
}
return z;
}