C# 4.0 大數的運算,BigInteger
前段時間,有個同事說
“30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000001”
是個質數。
直覺告訴我,光是在中間加幾個0,在後面加個1,估計不是質數。
有很多面試題,都會要面試者去做一些關於大數的運算,例如在這裡就有判斷上面這個數是不是質數的情況。
很明顯,Integer ,Long都是不能來處理如此巨大的數的。
在.net framework 4.0中,System.Numerics.dll 中提供了BigInteger 類。使用這個類可以很方便的解決這個問題。
判斷n是質數的方法:
1:如果是偶數,肯定不是質數
2:如果能夠被小於或等於Sqrt(n) 的數除盡,則不是質數。
程式碼如下:
private static bool IsPrime()
{
string largeNumber = @"30000000000000000000000...000000001”;
BigInteger bigInteger = BigInteger.Parse(largeNumber);
if (bigInteger.IsEven)
{
return false;
}
for (BigInteger bi = 3; BigInteger.Pow(bi, 2) <= bigInteger; bi += 2)
{
if (bigInteger % bi == 0)
{
return false;
}
}
return true;
}
本來for 迴圈中的程式碼應該是
for (BigInteger bi = 3; bi <= BigInteger.Sqrt(bigInteger); bi += 2)
{
if (bigInteger % bi == 0)
{
return false;
}
}
可惜的是BigInteger 不支援Sqrt方法,所以換用
for (BigInteger bi = 3; BigInteger.Pow(bi, 2) <= bigInteger; bi += 2)
結果如下圖:
可以知道”30000000000000000000000000…………………………..1”不是質數,可以被13除盡。
2:C語言中有道經典的題目是求100!後面有幾個0.
如果你不知道BigInteger的話,應該怎麼做?
因為偶數比5要多,所以i值比j值多很多,所以求100!有多少個0,可以認為是求j的值
當然也可以用公式
Sum = [100/5]+[100/(5^2)]+[100/(5^3)]=20+4+0=24;
如果你既沒有思路,也沒有公式,腦子裡面只有一個念頭:1*2*3*4*5*..*100 的for迴圈,然後統計0的數量的話,在4.0 中也可以實現,雖然好像速度慢了點,不過也還是可以得到答案的:
程式碼如下:
統計的程式碼如下:
執行結果如下:
int count = 0;
for (int i = strSum.Length - 1; i >= 0; i--)
{
if (strSum[i] == '0')
{
count++;
}
else
{
break;
}
}
還有很多使用大數的運算的地方,都等待著你的發揮!
相關文章
- 大整數運算C#實現C#
- Java大數相乘(使用BigInteger和BigDecimal)JavaDecimal
- C++ 大整數類(BigInteger類)實現C++
- java大整數四則運算Java
- 大數運算—大數加法、減法、乘法、除法詳解
- Shell階段02 shell變數運算(整數運算/小數運算), shell變數案例變數
- 算數運算子
- C# 位運算及例項計算C#
- 運算整數C/C++位運算技巧C++
- BigInteger
- C++ std::list實現大整數加法運算C++
- C# Math 中的常用的數學運算C#
- SHELL之數值運算
- 大資料的運算加減乘除大資料
- javascript計算指定數字的多少次方運算JavaScript
- C# 4.0 新物件ExpandoObjectC#物件Object
- 深入理解浮點數的運算
- java BigInteger 對許可權進行2的權的和計算Java
- java大數運算詳解【其十】大數除法之Burnikel-Ziegler除法演算法Java演算法
- java大數運算詳解【其九】大數除法之試商法(Knuth除法)核心演算法Java演算法
- JavaScript解決浮點數算數運算精度問題JavaScript
- shell執行小數運算
- JavaScript加減乘數運算JavaScript
- 處理器運算位數
- 複利計算4.0
- 演算法用連結串列模擬大整數加法運算演算法
- c#入門-型別轉換和運算C#型別
- [大資料量]java移位運算與位運算與資料型別的儲存大資料Java資料型別
- 浮點數在計算機底層的表示及運算計算機
- 計算機系統002 – 數值運算計算機
- js算數運算精度問題解決方案JS
- 計算機系統002 - 數值運算計算機
- JavaScript數字開任意次方運算JavaScript
- Java 基礎 之 算數運算子Java
- javascript基礎(算數運算子)(八)JavaScript
- java中與運算,或運算,異或運算,取反運算Java
- Java中的小數運算與精度損失Java
- python中精確的浮點數運算Python