求两个浮点数的最大公约数

作者在 2013-07-19 22:03:14 发布以下内容

初见此题    是在cf上面看到的一题有关计算几何的题目

然而那一题是求三个数的做大公约数   无奈   只好将两个数的最大公约数找找求了出来

求两个浮点数的最大公约数    有一种很直观的方法就是将浮点数化成分数       然后分别求出两个数的分母的最小公倍数和分子的最大公约数     然后做除法运算   就求出来了两个浮点数的最大公约数。。。。

代码如下:

 

#include <iostream>
#include <cstring>
#include <cmath>
#include <sstream>
#include <iomanip>
using namespace std;
int toint(string str)
{
    int n=0;
    stringstream stream;
    stream<<str;
    stream>>n;
    return n;
}
int gcd(int a,int b)
{
    int c=0;
    c=(a>b?b:a);
    int n;
    for(int i=1;i<=c;i++)
    { if(a%i==0&&b%i==0)
    n=i;

    }

    return n;
}

int main()
{
    string str1,str2;
    int x,y,z,w;
    cin>>str1>>str2;

    int loc1=str1.find(".",0);
    string s1=str1.substr(0,loc1);
    int len1=str1.length()-loc1-1;
    string s2=str1.substr(loc1+1,str1.length());

    int loc2=str2.find(".",0);
    string b1=str2.substr(0,loc2);
    int len2=str2.length()-loc2-1;
    string b2=str2.substr(loc2+1,str2.length());

    int a1,a2,m1,m2;
    a1=toint(s1)*pow(10,len1)+toint(s2);
    a2=pow(10,len1);
    m1=toint(b1)*pow(10,len2)+toint(b2);
    m2=pow(10,len2);

    int m=gcd(a1,m1);
    int n=gcd(a2,m2);
    int lcm=a2*m2/n;

    double lcmr=1.0*m/lcm;
    cout<<setprecision(10)<<lcmr<<endl;
    return 0;
}

另一种方法就是将原数乘以10^n(n小数位数),然后求新的得一组数的最大公约数,然后再除以原数小数位数最少的10^n,这种方法相对来说比较简单,就不再写代码了QAQ

默认分类 | 阅读 1782 次
文章评论,共0条
游客请输入验证码
文章分类
最新评论