5
社区成员
发帖
与我相关
我的任务
分享题源:http://www.acmicpc.sdnu.edu.cn/problem/show/1132
有三个正整数a,b,c(0 < a,b,c < 10^12),其中c不等于b。若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c。
第一行输入一个n,表示有n组测试数据,接下来的n行,每行输入两个正整数a,b。
输出对应的c,每组测试数据占一行。
2 6 2 12 4
4 8
思路:
关键词:gcd、暴力破解
内容:用欧几里得算法辗转相除求a和c的最大公约数=b,使用暴力迭代寻找c,如果找到等于b的最大公约数后,判断是否c和b相等,如果相等则跳过此次循环,进入下个循环继续寻找符合条件的c。
代码:
#include<bits/stdc++.h>
#include<iostream>
#define ll long long
using namespace std;
ll gcd(ll a,ll c){
return c==0?a:gcd(c,a%c);
}
int main(){
//cout<<gcd(6,2)<<endl;
int n;
ll a,b,c;
cin>>n;
while(n--){
cin>>a>>b;
for(ll i=1;i<10000;i++){
ll res = gcd(a,i);
if(res == b){
if(i==b)
continue;
else{
cout<<i<<endl;
goto l;//开门
}
}
}
l:;//出门
}
return 0;
}
输出:
