效率:對於一萬的階乘,可以瞬間出結果。
#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 型,以提高運算精度 ...