SORU
30 Mayıs 2013, PERŞEMBE


C#/b/c her zaman a/(b*c) eşit?tamsayı aritmetik

A, b ve c olmayan büyük pozitif tamsayılar olsun. /B/c her zaman C ile, a/(b * c) eşit yapar# tamsayı aritmetik? Benim için, C# gibi görünüyor:

int a = 5126, b = 76, c = 14;
int x1 = a / b / c;
int x2 = a / (b * c);

Benim sorum ise şu: x1 == x2 tüm a, b ve c için mi?

CEVAP
30 Mayıs 2013, PERŞEMBE


Bu soru çok my blog on June 4th, 2013 konu yaptım hoşuma gitti. Harika soru için teşekkür ederiz!


Büyük davalar gelmek kolay. Örneğin:

a = 1073741823; 
b = 134217727;
c = 134217727;

b * c negatif bir sayı taşıyor çünkü.

Bu gerçeği daha eklemek istiyorumaritmetik kontrol etti, a / (b * c) (a / b) / c arasındaki fark çalışan bir program ve çöker bir program arasındaki fark olabilir. b c ürünü bir tamsayı sınırları sonra taşarsa eski işaretli bir bağlam çökecek.

Küçük pozitif tam sayı, diyelim ki, bir kısa içine sığacak kadar küçük, kimliğini muhafaza edilmelidir.


Timothy Kalkanlar sadece bir kanıtı; burada alternatif bir kanıt sunuyorum gönderildi. Tüm numaralar burada negatif olmayan tam sayılar ve işlemleri taşma yok varsayalım.

x / y tamsayı bölme değeri q 0 <= r < y ** * * * 20*, böyle bulur.

Bölümü 22 ** değer q1 böyle bulur

q1 * b * c   r1 == a

0 <= r1 < b * c nereye

26* *bölümü ilk değer qt böyle bulur

qt * b   r3 == a

ve o zaman değer bulur q2 gibi

q2 * c   r2 == qt

Böylece qt yedek ve elde ederiz

q2 * b * c   b * r2   r3 == a

0 <= r2 < c 0 <= r3 < b.

İki şey aynı eşit birbirine eşit, bu yüzden

q1 * b * c   r1 == q2 * b * c   b * r2   r3

Bazı tamsayı için q1 == q2 x x varsayalım. Ve x çözmek için bunu kullanın:

q2 * b * c   x * b * c   r1 = q2 * b * c   b * r2   r3
x  = (b * r2   r3 - r1) / (b * c)

nerede

 0 <= r1 < b * c
 0 <= r2 < c
 0 <= r3 < b

x sıfırdan büyük olabilir? Hayır. Eşitsizlikler var:

 b * r2   r3 - r1 <= b * r2   r3 <= b * (c - 1)   r3 < b * (c - 1)   b == b * c

O kısmını pay x sıfırdan büyük olamaz bu yüzden her zaman b * c, daha küçük.

x sıfırdan küçük olabilir? Hayır, benzer bir argüman, okuyucuya sol tarafından.

Bu nedenle tamsayı x sıfır, q1 == q2 bu nedenle.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FlippinWindows | #1 Windows Tutorial Channel!

    FlippinWindo

    23 Mayıs 2010
  • Tire Rack

    Tire Rack

    31 Mayıs 2007
  • Wild Academy

    Wild Academy

    8 Aralık 2009