Özellikle: İki işaretsiz tam bilgisi, (a, b) ve l (a * b) hesaplamak istiyor% UINT_MAX (UINT_MAX maksimal işaretsiz int olarak tanımlanmaktadır). Bunu yapmanın en iyi yolu nedir?Modülo çarpma
Arkaplan: Geometrik bir öyküyü öykünecek bir modül yazmak zorundayım, bir sonraki öğeyi (modulo UINT_MAX) verecek olandan okuyordum, bulduğum tek çözüm geçerli öğeyi kendi zamanlarına eklemek. aşağıdaki mantık kullanılarak yapılır eklenirken. (I aritmetik dizisi için kullanan) current_value =
for(int i=0; i<b; ++i){
if(UINT_MAX - current_value > difference) {
current_value += difference;
} else {
current_value = difference - (UINT_MAX - current_value);
}
birinci tekrarda bir (her yineleme güncelleme ve fark (her zaman = ve) Açıkçası bu bir akıllı bir çözüm değildir. akıllı bir kişi bunu başarmak istiyorum nasıl ?
Teşekkürler! bahsedildiği gibi mevcut iki katı genişlikte bir türü varsa
Modül operatörü veya 8 bayt tamsayı türlerini kullanamaz mısınız? – davogotland
"Uzun uzun" için çok basit bir aptal çözüm int'den daha uzun bir tiptir. uzun uzun sonuç = ((uzun uzun) a) * ((uzun uzun) b)% ((uzun uzun) UINT_MAX); –
@JoachimIsaksson sonuçta, o zamana kadar uzun bir süre olmamalıdır, değil mi? – davogotland