1

これは簡単な作業ですが、私はそれを行う方法を理解できないようです

関数構造の例を次に示します。

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 です。プログラミング言語は重要ではありません。私はちょうどアルゴリズムが必要です

助けてください..ありがとう!

4

6 に答える 6

4

小数点以下が 1 桁しかない場合は、数値に 10 を掛けて整数に変換し、整数 GCD 関数を実行します。

これにより、浮動小数点の精度エラーも回避できます。

この回答を引用すると、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
于 2012-02-22T09:27:28.053 に答える
3

8.8 と 6.6 の場合、88 と 66 の GCD を見つけて、それを 10 で割ります。

于 2012-02-22T09:29:23.067 に答える
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 です。

于 2012-02-22T09:43:09.577 に答える
1

ウェブ上には、GCD 関数のコードを見つける場所が無数にあります。厳密に言えば、整数でのみ定義されるため、double を 10 倍し、GCD を計算し、結果を 10 で割ることをお勧めします。これにより、間違ったデータ型を使用することによる苦痛から解放されます。

于 2012-02-22T09:28:56.727 に答える
1

ここにいくつかの Java コードを含む Google のソースがあります: http://www.merriampark.com/gcd.htmこれはかなり包括的です。

于 2012-02-22T09:29:13.983 に答える
0

2つの方法を使用する

  1. 従来の除算法
  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;
        }
    }
于 2012-02-22T09:40:05.387 に答える