Ardışık bölme/kalan işlemler ile sayan bir yordamı düşünün.Tam Sayı Bölmeli tabanlı bir yordamla sayma - Formüle dayalı bir yaklaşım var mı?
64 bit temettü ile başlayarak, rutin sabit bir ayırıcı tarafından böler.
Kalan 0 ise, rutin geri döner.
Aksi takdirde, kalan kısmı 2^32 ile çarparak ve tamsayı katsayısını ekleyerek yeni bir temettü oluşturulur. kodda
: keyfi Divisor ile
/// ULong - 64 bit, unsigned
/// UInt - 32 bit, unsigned
const UInt Divisor;
int TrickyCounter(ULong Dividend)
{
int count = 0;
Ulong Quotient;
UInt Remainder;
do {
Quotient = Dividend/Divisor;
Remainder = Dividend%Divisor;
assert((Quotient >> 32) == 0);
count = count + 1;
Dividend = ((ULong)Remainder << 32) + Quotient;
} while (Remainder != 0);
return count;
}
istenen sayısını elde etmek için gerekli olan Temettünün hesaplamak için tercihen non-ilerlerken yöntem var mıdır?
Birçok ilk temettü için, bu "Assert" koşuluna hızlıca vurulur gibi görünüyor. Bazı temettüler sonsuza dek bu döngüye neden olur mu?
Eğer bir sayım yerine, rutin bölümleri döndürürse, İadeyi istediğim numarayı üretmek için Kâr Payını hesaplayabilir miyim?
Uint TrickyNumber(ULong Dividend, int count)
{
Ulong Quotient = 0;
UInt Remainder;
while (count > 0)
Quotient = Dividend/Divisor;
Remainder = Dividend%Divisor;
assert((Quotient >> 32) == 0);
count = count - 1;
Dividend = ((ULong)Remainder << 32) + Quotient;
}
return (UInt)Quotient;
}
? Ayrıca, son sorunuza göre, ikinci kod snippet'i istediğin gibi görünmüyor. Aniden, son sorunuza 'hayır' cevabını veren iterasyonların sayısını belirlemek için kullanılan bir sayım parametresi vardır. – mweerden
Karışıklıktan dolayı özür dilerim - başka bir çıkış koşulu olmayan ilk forma uygulanan son metin. Yanıltıcı, birleştirmek için iki temiz parçaya sahip olmak için 2^32'nin altında kalan bölümü tutar. –