老规矩,先上题目 杭电oj2504
题目的意思大概是:
给三个数,知道二个数的最大公约数b和其中一个数a,要求另外一个数c。
思路:首先我们应该知道所求的c一定是b的倍数,不然约不了分嘛,这样就可以不要一个一个往上推,只要加最大公约数的倍数,减小了时间复杂度。
接下来就是把最大公约数数的倍数和a一起求一下最大公约数,如果求出来的最大公约数等于b,那么大功告成,输出结果,如果不是,用while循环,继续加一倍b,继续判断,知道找到我们要求的那个c
嘻嘻,是不是简单易懂,
那就上代码吧
/*好题,最大公倍数的逆推算法,这里有个技巧可以减少时间复杂度就是
往上推的数一定是最大公倍数的倍数*/#include<stdio.h>int Fun(int n,int m)
{int t;while(n%m) //辗转相除法求最大公约数{t = m;m = n%m;n = t;}return m;
}int main()
{int n,a,b;scanf("%d",&n);while(n--){int i = 1;scanf("%d %d",&a,&b);i=2*b;while(Fun(a,i) != b){i += b;}printf("%d\n",i);}return 0;
}
如果有错误或者有难懂的地方请大家告诉我哦。
一起进步吖!