您的位置:首页 > 其它

HDU 2504 GCD

2017-01-13 20:13 381 查看
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2504

题解:本来暴力就可以解决,我却一直在找好的方法,我想了又想,既然要求最小的,那么辗转相除只进行了一次结束,所以我编了代码2,但是wa,至今不知道为什么错。

暴力的代码就是一个一个试。

没有优化的代码:

#include<iostream>
using namespace std;
const int maxn = 1000000 + 5;
int gcd(int n, int m) {
return n%m ? gcd(m, n%m) : m;
}
int main() {
int num;
cin >> num;
while (num--) {
int n, m;
while (cin >> n >> m) {
int result;
for (int i = m + 1;i < maxn;i++) {
if (i == n) continue;
else if (i < n&&gcd(n, i) == m) {
result = i;
break;
}
else if (i > n&&gcd(i, n) == m) {
result = i;
break;
}
}
cout << result << endl;
}
}
}优化以后减少遍历的次数,因为肯定是最大公约数倍数,所以可以做点文章:
#include<iostream>
using namespace std;
const int maxn = 1000000 + 5;
int gcd(int n, int m) {
return n%m ? gcd(m, n%m) : m;
}
int main() {
int num;
cin >> num;
while (num--) {
int n, m;
while (cin >> n >> m) {
int result;
for (int i = m + m;;i+=m) {
if (i == n) continue;
else if (i < n&&gcd(n, i) == m) {
result = i;
break;
}
else if (i > n&&gcd(i, n) == m) {
result = i;
break;
}
}
cout << result << endl;
}
}
}
WA代码(知道为什么错了,请告知我,谢谢):

#include<iostream>
using namespace std;
const int maxn = 1000000 + 5;
int gcd(int n, int m) {
return n%m ? gcd(m, n%m) : m;
}
int main() {
int num;
cin >> num;
while (num--) {
int n, m;
while (cin >> n >> m) {
int result;
for (int i = 2;;i++) {
int temp = m*i;
if (n%temp == m || temp%n == m) {
result = temp;
break;
}
}
cout << result << endl;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: