又见GCD
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4353 Accepted Submission(s): 2080
Problem Description
有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b。若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c。
Input
第一行输入一个n,表示有n组测试数据,接下来的n行,每行输入两个正整数a,b。
Output
输出对应的c,每组测试数据占一行。
Sample Input
2
6 2
12 4
Sample Output
4
8
思路:
b是a,c的最大公约数,已知a,b求最小c
显然,有关系:
a / b 与 c /b 互质
记
p1 = a / b , p2 = c / b
即p1、p2互质
题目则变为已知p1,求最小互质数p2
上代码
#include<iostream>
#include<algorithm>
using namespace std;
int findPrime(int p1){
int p2 = 2;
bool flag;
for(;;p2++){
flag = true;
for(int i = 2; i <= sqrt(p1) || i <= sqrt(p2); i++){
if(p1 % i == 0 && p2 % i == 0){ //如果有公约数,标记flag查找下一个p2
flag = false;
break;
}
}
if(!flag)
continue;
else
return p2;
}
}
int main(){
int n;
scanf("%d",&n);
int a, b;
int p1, p2;
while(n--){
scanf("%d%d", &a, &b);
p1 = a / b;
printf("%d\n", b * findPrime(p1));
}
return 0;
}
换一种观点来看题目