C语言程序设计100例之(10):最大公约数
例10 最大公约数 问题描述 有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b。若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c。 输入数据 第一行输入一个n,表示有n组测试数据,接下来的n行,每行输入两个正整数a,b。 输出格式 输出对应的c,每组测试数据占一行。 输入样例 2 6 2 12 4 输出样例 4 8 (1)编程思路。 利用转辗相除法求两个整数的最大公约数。例如,求整数m=48,n=18两个数的最大公约数的方法如左图所示。 具体做法是:,若m%n==0,则n是最大公约数,否则,计算 r=m%n,置m=n,n=r,重复这个过程,直到m%n==0。 将求整数m和n的最大公约数定义为函数 int gcd(int m,intn); 。 在本题中,由于b是a、c的最大公约数,且c!=b,所以对c=2*b、3*b…进行穷举判断即可直到最小的满足条件的c。 (2)源程序。 #include <stdio.h> int gcd(int m, int n) { int r; while(m%n!=0) { r=m%n; m = n; n = r; } return n; } int main() { int t,a,b,c; scanf("%d",&t); while(t--) { scanf("%d%d",&a,&b); c=2*b; while(gcd