- 题目描述:
-
给定两个正整数a,b(1<=a,b<=100000000),计算他们公约数的个数。
如给定正整数8和16,他们的公约数有:1、2、4、8,所以输出为4。
- 输入:
-
输入包含多组测试数据,每组测试数据一行,包含两个整数a,b。
- 输出:
-
对于每组测试数据,输出为一个整数,表示a和b的公约数个数。
- 样例输入:
-
8 16 22 16
- 样例输出:
-
4 2
这道题由于a,b是在100000000以内,如果是直接对两个数的公约数进行计数,肯定超时,代码如:
#include <stdio.h> #include <stdlib.h> int main() { int m,n,ct,i,temp; while(scanf("%d %d",&m,&n) != EOF) { temp = 0; ct = m < n ? m : n; for(i = 1; i <= ct; i++) while(i != ct + 1) { if(m % i == 0 && n % i == 0) { temp++; break; } else break; } printf("%d\n",temp); } //system("pause"); return 0; } 那么换一种思路:先求出它们的最大公约数,然后在最大公约数之下在找它们的公约数,计算量就少了许多,这样就比较高效的求解出来了,下面贴上代码: #include <stdio.h> int gcd(int a,int b) { return b == 0 ? a:gcd(b,a % b); } int main() { int m,n,c,ans,i; while(~scanf("%d%d",&m,&n)) { c = gcd(m,n); ans = 0; for(i = 1; i * i < c; i++) if(c % i == 0) ans += 2;//由于公约数在C两边是对称分布的,所以要加上2 if(c == i * i) ans += 1;//如果c = i * i,则把这个i 也要加上 printf("%d\n",ans); } return 0; }