初见此题 是在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