特化的大數類 只支援與無符號四字整數的乘法運算

2021-10-08 19:31:09 字數 1533 閱讀 1971

效率:對於一萬的階乘,可以瞬間出結果。

#include

#include

//特化的計算。若乘0,則會出錯。

//採用int_max進製。恰好可以直接分解為16進製制。

//檢驗了幾十的階乘,結果是正確的。

//缺點:記憶體有連續依賴。

class

mutiee

assert

(nummem[maxat +1]

<=

0xffffffff);

//最高位+1處不應出現進製的情況。

if(nummem[maxat +1]

)maxat +=1

;//每次乘法至多會導致進一位。

return

*this;}

public

:mutiee

(void)~

mutiee

(void

) mutiee&

clear

(void

) mutiee&

operator*=

(unsigned num)

小於(2^64-1),因而不會引發截斷。(%2^32留在原位。)

return

this

->

correct()

;}//沒有專門的輸出優化。

//與16進製制順序直接匹配。

mutiee&

become_fact

(int num)

//利用特殊的迴圈展開:代數式迴圈展開。對於0,也可以呈現出正確的結果。

while

(i <= num)(*

this)*

= i++

;return

*this

;//進一步優化:將一串數字流【因式分解(簡單的,例如偶數分解)並重組為一串接近intmax的乘法流】再進行累乘。即使在大於65536的地方,也可以實現大於一階,小於二階的迴圈展開。

}void

print

(void

)putchar

('\n');

}};int

main()

*/ ee.

clear()

;for

(int i =

1; i <=

10000

; i++

)ee *

= i;

ee.print()

;//可以不到一秒出結果。

秒出結果。

/*//50萬-1的階乘:

ee.clear();

for (int i = 1; i < 500000; i++)

freopen("fac(499999).txt", "wb", stdout);

ee.print();

*///release64下用了幾分鐘的時間。

}

關於有符號與無符號的位元組

經歷過幾個時期,一直都用無符串的,總感覺有乙個符號位非常的不靠譜,編譯器什麼時候給你轉一下型別,或者幹了什麼 後來又覺得c嘛,不會管你的到底是 1 還是255,反正都一樣,什麼型別啊,都是浮動,不就是一段記憶體長這樣嘛 後來又變了,覺得unsigned char真是麻煩,還得這麼長或者typedef...

無符號右移負數 關於負數的右移與無符號右移運算小結

對於帶符號右移,若為負數,則在儲存時首位表示符號位,其值為1,表示該值是負數的移位,在移位過程中,高位補1,若符號位是0,表示是正數,在移位過程中高位補零,兩者的前提是符號位保持不變 對於負數的右移 因為負數在記憶體中是以補碼形式存在的,所有首先根據負數的原碼求出負數的補碼 符號位不變,其餘位按照原...

無符號數與有符號數的操作

void sum void 當混合不同型別的變數進行計算時,便可能會發生型別轉換 相同型別的資料在轉換時有規則可循 字元必須先轉換為整數 c語言規定字元型別資料和整型資料之間可以通用 short型轉換為int型 同屬於整型 float型資料在運算時一律轉換為雙精度 double 型,以提高運算精度 ...