公約數問題

題目描述:

給定兩個正整數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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章