2011-01-17 6 views
0

誰でも私に答えられるなら、これがなぜ機能するのか、大いに感謝します。練習(第4章、第7章、第8章)では、 9 - ((合計 - 1)%10) の式を持つと、次のように簡略化することができます: 10 - 10) しかし、これはうまくいかないでしょう。代わりに彼は代わりを提供します: (10 - (合計%10))%10"Cプログラミング:近代的なアプローチ"のエクササイズ

今、私は彼が最初の単純化にいかに得たのか理解しますが、なぜそれが間違っているのか、事前

+2

「代替」はどのように簡略化されていますか?それは元のオペランドと同じ数のオペランドと演算子を持ち、 '%'演算子は '-'よりも高価です。私は本を​​知らないが、もしそれが確かに良いとすれば、それは本文に説明されているのだろうか? – Clifford

+0

これは運動です。最初の「単純化」がなぜ間違っているのか、そして2番目のものがうまくいくのかを伝えなければなりません。本書では、いくつかの演習への回答を提供しています。 –

答えて

3

おかげで第二式は等価ではないことを確認するためにtotal = 10のための出力を考えてみましょう。

(あなたがC99で何をしたい%の振る舞いは事前C99 Cで実装定義、および定義されているためではなく)3番目の式がtotal > 0ない限り、最初の式と等価ではないことにも注意してください。

total > 0は、第一及び第三の表現が原因以下の数学的アイデンティティと同等であると仮定すると:

(a % b) == (((a + c) % b) - c) % b 

時計面上の操作を行って想像し、理由を理解するために。

+0

申し訳ありませんが、まだ表示されません。表現にアイデンティティを適用して、ステップを私に示してもらえますか? –

+0

@Facu: 'a =(total-1)'、 'b = 10'、' c = 1'。 –

+0

Ohhhhhhhhhhhhhh今私は理解する!どうもありがとう! –

1

これは、Cのモジュロが負の数を許容するためです。

ので-5%10は-5最初のケースでは代わりに5

、9 - ((合計 - 1)%10)は常に正であります。

-1<が合計で<の場合、2番目の場合は負の値になります。3番目のケースでは、再び正の範囲に戻ってネガのために折り返されます。

モジュロの一般的なことは、一般的にポジティブのみ(ネガティブに実装した理由がわからないため)が望ましいからです。

+0

@ AbstractDissonance-これについては確かですか?私は、C仕様がモジュラスの振る舞いを負の値で指定していないという印象を受けました。 – templatetypedef

+0

実際には、結果は実装定義です。 –

+0

申し訳ありませんが、9 - ((合計 - 1)%10)から(10 - (合計%10))%10に進む手順を教えてください。それは私が理解していないことです –

0

9 - ((合計)%10)が間違っている理由を示すには、矛盾を使用します。そして

total = 10

9 - ((10-1)%10)==> 9-(9%10)==> 9-9 = 0

しかし、 10-(10〜10%)==> 10 -0 = 10

したがって、10 - ((合計)%10)9と同等ではない - ((総-1)%10)

4

x%mは、ほとんどのC実装で(-m、m)の範囲を持ちます。数学的には一般に(0、m)から定義される。したがって、mを加えることによって、再びモジュロはCを数学的なものに変換する。

0

代替が簡素化ではなく、どちらの式が最初から前提は欠陥があるので、最初にequvalentです:

int total ; 
for(total = -10; total <= 10; total++) 
{ 
    printf("%d:\t%d\t%d\t%d\n", total, 
           9 - ((total - 1) % 10), 
           10 - (total % 10), 
           (10 - (total % 10)) % 10) ; 
} 

が生成されます

-10: 10  10  0 
-9:  9  19  9 
-8:  18  18  8 
-7:  17  17  7 
-6:  16  16  6 
-5:  15  15  5 
-4:  14  14  4 
-3:  13  13  3 
-2:  12  12  2 
-1:  11  11  1 
0:  10  10  0 
1:  9  9  9 
2:  8  8  8 
3:  7  7  7 
4:  6  6  6 
5:  5  5  5 
6:  4  4  4 
7:  3  3  3 
8:  2  2  2 
9:  1  1  1 
10:  0  10  0 

を最後のものは、ゼロより大きい整数の場合にのみ等価です。

+0

申し訳ありませんが、私は練習の内容を忘れていました。合計は常に0より大きい。私は最初と3番目の式が合計> 0と等しい理由を理解していません –

+0

@Facu T:プログラミングや数学を教えることは本の目的ですか? – Clifford

+0

それは私にとっては問題ではありません。とにかく、誰も私に1から3へのステップを教えてくれませんでした。私はそれが数学的アイデンティティのために理解していますが、私はまだそれを3に達する方法を知らないのです –

関連する問題