公约数问题

题目描述:

给定两个正整数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;
}


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