- 題目描述:
-
給定兩個正整數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; }