杭电2504 又见GCD

又见GCD

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 19985    Accepted Submission(s): 8352


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
题目看上去不难,但是就是我开始理解错了一个地方,我以为只要是最大公约数的两倍就行,但是在WA了。然后找到了一个例子,24 4 ?,这个?应该是20的,但根据我的算法的话应该是8,但8的话就是24 和8的最大公约数的,所以不成立。
所以,就暴力求解,从2*b到1000000之间找到最大的那个数字(符合条件的那个数字)。
然后附上代码:
#include <iostream>
#include<math.h>
#include <iomanip>
#include<cstdio>
#include<string>
#include<map>
#include<vector>
#include<list>
#include<algorithm>
#include<stdlib.h>
#include<iterator>
#include<sstream>
#include<string.h>
#include<stdio.h>
using namespace std;
int gcd(int a,int b)
{
    int big=a;
    int smal=b;
    int ck;
    if(big<smal)
    {
        ck=a;
        a=b;
        b=a;
    }
    int temp;
    while(smal>0)
    {
        temp=big%smal;
        big=smal;
        smal=temp;
    }
    return big;
}


int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int a,b,c;
        cin>>a>>b;
        for(int i=2*b;i<1000000;i=i+b)
        {
            if(gcd(a,i)==b)//暴力寻找
            {
                c=i;
                break;
            }
        }
        cout<<c<<endl;
    }
    return 0;
}
 
原文地址:https://www.cnblogs.com/William-xh/p/7289334.html