HDU 2504 又见GCD

来源:互联网 发布:五常大米价格 知乎 编辑:程序博客网 时间:2024/05/16 05:12

又见GCD

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


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
26 212 4
 

Sample Output
48

分析:

方法一:

c=b^i,让d=a/b,只需要判断 i 和 d 互质即可。

判断互质需要计算gcd( i , d )==1;

代码如下:

#include <stdio.h>int gcd(int a,int b){int temp;if(a<b){temp=a;a=b;b=temp;}while(a%b){temp=b;b=a%b;a=temp;}return b;}int main(){int T;int a,b,d,i;scanf("%d",&T);while(T--){scanf("%d %d",&a,&b);d=a/b;for(i=2;1;i++){if(gcd(d,i)==1){printf("%d\n",i*b);break;}}}return 0;}

方法二:

因为c=b^i ,暴力找出gcd(c , a)==b即可

代码如下:

#include <stdio.h>int gcd(int a,int b){    int temp;    if(a<b)    {        temp=a;a=b;b=temp;    }    while(a%b)    {        temp=b;        b=a%b;        a=temp;    }    return b;}int main(){    int T;    int a,b,c,d,i;    scanf("%d",&T);    while(T--)    {        scanf("%d %d",&a,&b);        c=2*b;        while(gcd(a,c)!=b)        {            c+=b;        }        printf("%d\n",c);    }        return 0;}



0 0
原创粉丝点击