1

電卓アプリの一部として、シグマ表記を使用して実装しようとしています。ただし、出力される結果は常に 10 進数であり、残りは重要ではありません。私は単に小数を分数に変更したいだけです。

私はすでにreduce関数を持っています.私が抱えている問題は、「0.96875」のような小数から小数の値「31/32」になることです.

ありがとう!

PS: 私はほぼすべてを調べましたが、私の人生では、これを理解することはできません. この時点で必要なのは、小数を取り出す方法だけです。その後、小数を減らすことができます。

これが私の削減方法です:

    -(void)reduce {

    int u = numerator;
    int v = denominator;
    int temp;

    while (v != 0) {
        temp = u % v;
        u = v;
        v = temp;
    }

    numerator /= u;
    denominator /= u;

}
4

3 に答える 3

5

これは自分で見つけました。私がしたことは、分子と分母に 1000000 を掛けることでした (小数は .96875/1 のように見えたことを思い出してください) 96875/100000

次に、この reduce メソッドを使用して、最低条件にしました。

    -(void)reduce {

    int u = numerator;
    int v = denominator;
    int temp;

    while (v != 0) {
        temp = u % v;
        u = v;
        v = temp;
    }

    numerator /= u;
    denominator /= u;

}

最後に、print メソッドを使用して分数形式にしました。

//In the .h
@property int numerator, denominator, mixed;
-(void)print;

//In the .m       
@synthesize numerator, denominator, mixed;

-(void)print {
    if (numerator > denominator) {
        //Turn fraction into mixed number
        mixed = numerator/denominator;
        numerator -= (mixed * denominator);
        NSLog(@"= %i %i/%i", mixed, numerator, denominator);
    } else if (denominator != 1) {
        //Print fraction normally
        NSLog(@"= %i/%i", numerator, denominator);
    } else {
        //Print as integer if it has a denominator of 1
        NSLog(@"= %i", numerator);
    }
}

そして、私の望ましい出力を得ました:

31/32
于 2012-04-19T19:02:32.603 に答える
0

どこからか思い出せませんが、しばらく前にこれを行うかなり良い方法を見つけました。とにかく、次のように再帰的に動作します (これは疑似コードであり、C ではありません):

function getRational(float n)
  let i = floor(n); (the integer component of n)
  let j = n - i;
  if j < 0.0001 (use abritrary precision threshold here), return i/1
  let m/n = getRational(1 / j)
  return ((i * m) + n) / m

たとえば、3.142857 を開始点とします。

i = 3
j = 0.142857
m/n = getRational(7)
  i = 7
  j = 0
  return 7/1
m/n = 7/1
return ((3*7)+1) / 7 = 22/7

または、より複雑な例、1.55:

i = 1
j = 0.55
m/n = getRational(1.81818181)
  i = 1
  j = 0.81818181
  m/n = getRational(1.22222222)
    i = 1
    j = 0.22222222
    m/n = getRational(4.5)
      i = 4
      j = 0.5
      m/n = getRational(2)
        i = 2
        j = 0
        return 2/1
      m/n = 2/1
      return ((4*2)+1)/2 = 9/2
    m/n = 9/2
    return ((1*9)+2)/9 = 11/9
  m/n = 11/9
  return ((1*11)+9)/11) = 20/11
m/n = 20/11
return ((1*20)+11)/20 = 31/20

私は一度PIでこれを試しました。しばらく時間がかかりますが、しきい値を 0.01 に設定すると、355/113 を返す前に数回の再帰だけが減少します。

戻り時に深くなりすぎると、大きすぎる整数になってしまう可能性があるというちょっとした落とし穴があります。精度のしきい値を 0.01 などのかなり緩いものに設定することを除いて、それを可能にする良い方法を実際には調べていません。

于 2012-10-17T14:06:23.283 に答える