这是一项简单的任务,但我似乎无法弄清楚如何做到这一点
这是一个示例函数结构
private double GetGCD(double num1, double num2)
{
//should return the GCD of the two double
}
测试数据
num1 = 6;
num2 = 3;
*return value must be 3*
num1 = 8.8;
num2 = 6.6;
*return value must be 2.2*
num1 = 5.1;
num2 = 8.5;
*return value must be 1.7*
注意:最大小数位数为1。 编程语言并不重要。我只需要algorthm
请帮忙..谢谢!
答案 0 :(得分:4)
如果您只有一位小数,请将数字乘以10,将它们转换为整数并运行integer GCD function。
这也可以为您节省floating point precision errors。
引用this answer,Python中的基本欧几里德算法(对于整数!)是:
def gcd(a, b):
"""Calculate the Greatest Common Divisor of a and b.
Unless b==0, the result will have the same sign as b (so that when
b is divided by it, the result comes out positive).
"""
while b:
a, b = b, a%b
return a
所以,你的代码应该是这样的:
def gcd_floats(x,y):
return gcd( int(x*10), int(y*10) )/10
答案 1 :(得分:3)
当它是8.8和6.6时,你可以找到88和66的GCD,然后除以10。
答案 2 :(得分:1)
网上有数以万计的地方可以找到GCD功能的代码。严格说来,因为它只是在整数上定义,我建议你将你的双精度乘以10,算出GCD并将结果除以10.这样可以避免因使用错误的数据类型而产生的痛苦世界。
答案 3 :(得分:1)
这是google的一个来源,其中包含一些java代码:http://www.merriampark.com/gcd.htm这非常全面。
答案 4 :(得分:1)
没有一个不离散的数字的GCD。但是,您的情况更具体。如果您的输入不是Double,而是Decimal,那么您可以将其转换为Fraction,乘以分母,找到分子的GCD并向下分割。那就是:
8.800 = 8800/1000 = 44/5 (by GCD)
6.600 = 6600/1000 = 33/5 (by GCD)
5.100 = 5100/1000 = 51/10
8.500 = 8500/1000 = 17/2
在此步骤中简化分数非常有用,以避免数字过大。
转向共同点:
44*5/5*5 = 220/25
33*5/5*5 = 165/25
51*2/2*10 = 102/20
17*10/2*10 = 170/20
分子的GCD:
gcd(165,220) = 55
gcd(102,170) = 34
答案是55/25和34/20。
答案 5 :(得分:0)
使用2种方法
class GCD
{
public static void main(String[] args)
{
int a = (int)(1.2*10);
int b = (int)(3.4*10);
System.out.println((float)gcd(a, b)/10);
}
// 1
public static int gcd(int a, int b)
{
if(b==0)
return a;
else
return gcd(b, (int)a%b);
}
// 2
public static int gcd(int a, int b)
{
int k,i;
if(a>b)
k = b;
else
k = a;
for(i=k; i>=2; i--)
{
if( (a%i==0)&&(b%i==0) )
{
break;
}
}
return i;
}
}