在C++程序中怎么求两个数公约数的个数?紧急

在C++程序中怎样求两个数公约数的个数?紧急~~~
假如一个个数字去试的话,前面小的数字还行,但是到后面的大数字就不行了,最大的数有2147483647。就是如20和30的话,公约数个数为4个。各位大神给点思路吧~~~

------解决方案--------------------

int gongyueshu(unsigned int no1,unsigned int no2)

    unsigned int temp; 
    if(no1 > no2) 
    {  
        temp = no1;
        no1 = no2;  
        no2 = temp; 
    } 
    vector<int> vFactor;
    unsigned int i=1, nTop = no1;
    int nCount = 0;
    while (i< nTop)
    {
nTop = no1/i;
if (no1%nTop ==0 && no2%nTop == 0)
{
vFactor.push_back(nTop);
nCount++;
}
if (nTop != i && no1%i ==0 && no2%i == 0)
{
vFactor.push_back(i);
nCount++;
}
i++;
    }
    for(int i = 0;i < vFactor.size();i++) 
    {  
        cout << "公约数:" << vFactor[i] << endl;    // 显示公约数
    }
    return nCount;
}
int main(int argc, char** argv)
{
    cout << gongyueshu(2100000000 ,3100000000) << endl;
    cout << gongyueshu(20 ,30) << endl;
     
    double t;    //计算运行时间的代码
    clock_t time;
    time=clock();
    t=(double)time/CLK_TCK;
    cout<<"time is "<<t<<"  seconds "<<endl;
//cout << nCount << endl;
getchar();
    return 0;
}


输出如下:
公约数:1
公约数:2
公约数:4
公约数:5
公约数:8
公约数:10
公约数:16
公约数:20
公约数:100000000
公约数:25
公约数:32
公约数:40
公约数:50000000
公约数:50
公约数:64
公约数:80
公约数:25000000
公约数:100
公约数:20000000
公约数:125
公约数:128
公约数:160
公约数:12500000
公约数:200
公约数:10000000
公约数:250
公约数:256
公约数:320
公约数:6250000
公约数:400
公约数:5000000
公约数:500
公约数:4000000
公约数:625
公约数:640
公约数:3125000
公约数:800
公约数:2500000
公约数:1000
公约数:2000000
公约数:1250
公约数:1280
公约数:1562500
公约数:1600
公约数:1250000
公约数:2000
公约数:1000000
公约数:2500
公约数:800000
公约数:781250
公约数:3125
公约数:3200
公约数:625000
公约数:4000
公约数:500000
公约数:5000
公约数:400000
公约数:390625
公约数:6250
公约数:6400
公约数:312500
公约数:8000
公约数:250000
公约数:10000
公约数:200000
公约数:12500
公约数:160000
公约数:156250
公约数:15625
公约数:16000
公约数:125000
公约数:20000
公约数:100000
公约数:25000
公约数:80000
公约数:78125
公约数:31250
公约数:32000
公约数:62500
公约数:40000
公约数:50000
81
公约数:1
公约数:10
公约数:2