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

  • Matthew Pearce

    Matthew Pear

    9 AĞUSTOS 2009
  • The Weavers of Eternity Paracord Tutorials

    The Weavers

    1 Ocak 2014
  • xXGAMERrs_Xx

    xXGAMERrs_Xx

    31 Temmuz 2014