C# 4.0 大數(shù)的運(yùn)算--BigInteger的應(yīng)用詳解
“30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000001”
是個(gè)質(zhì)數(shù)。
直覺告訴我,光是在中間加幾個(gè)0,在后面加個(gè)1,估計(jì)不是質(zhì)數(shù)。
有很多面試題,都會(huì)要面試者去做一些關(guān)于大數(shù)的運(yùn)算,例如在這里就有判斷上面這個(gè)數(shù)是不是質(zhì)數(shù)的情況。
很明顯,Integer ,Long都是不能來處理如此巨大的數(shù)的。
在.net framework 4.0中,System.Numerics.dll 中提供了BigInteger 類。使用這個(gè)類可以很方便的解決這個(gè)問題。
判斷n是質(zhì)數(shù)的方法:
1:如果是偶數(shù),肯定不是質(zhì)數(shù)
2:如果能夠被小于或等于Sqrt(n) 的數(shù)除盡,則不是質(zhì)數(shù)。
代碼如下:
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 循環(huán)中的代碼應(yīng)該是
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)
結(jié)果如下圖:
可以知道”30000000000000000000000000…………………………..1”不是質(zhì)數(shù),可以被13除盡。
2:C語言中有道經(jīng)典的題目是求100!后面有幾個(gè)0.
如果你不知道BigInteger的話,應(yīng)該怎么做?
100! 可以理解為
因?yàn)榕紨?shù)比5要多,所以i值比j值多很多,所以求100!有多少個(gè)0,可以認(rèn)為是求j的值
當(dāng)然也可以用公式
Sum = [100/5]+[100/(5^2)]+[100/(5^3)]=20+4+0=24;
如果你既沒有思路,也沒有公式,腦子里面只有一個(gè)念頭:1*2*3*4*5*..*100 的for循環(huán),然后統(tǒng)計(jì)0的數(shù)量的話,在4.0 中也可以實(shí)現(xiàn),雖然好像速度慢了點(diǎn),不過也還是可以得到答案的:
代碼如下:
統(tǒng)計(jì)的代碼如下:
運(yùn)行結(jié)果如下:
int count = 0;
for (int i = strSum.Length - 1; i >= 0; i--)
{
if (strSum[i] == '0')
{
count++;
}
else
{
break;
}
}
還有很多使用大數(shù)的運(yùn)算的地方,都等待著你的發(fā)揮!
- Java中兩個(gè)大數(shù)之間的相關(guān)運(yùn)算及BigInteger代碼示例
- Java大數(shù)字運(yùn)算之BigInteger
- SQLServer中bigint轉(zhuǎn)int帶符號(hào)時(shí)報(bào)錯(cuò)問題解決方法
- 一個(gè)函數(shù)解決SQLServer中bigint 轉(zhuǎn) int帶符號(hào)時(shí)報(bào)錯(cuò)問題
- mysql中int、bigint、smallint 和 tinyint的區(qū)別詳細(xì)介紹
- 超出JavaScript安全整數(shù)限制的數(shù)字計(jì)算BigInt詳解
相關(guān)文章
C#?彈出窗口show()和showdialog()的兩種方式
本文主要介紹了C#?彈出窗口show()和showdialog()的兩種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07c#中winform根據(jù)郵箱地址和密碼一鍵發(fā)送email的實(shí)現(xiàn)
本文主要介紹了c#winform根據(jù)郵箱地址和密碼一鍵發(fā)送email的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07C#使用TcpListener及TcpClient開發(fā)一個(gè)簡(jiǎn)單的Chat工具實(shí)例
下面小編就為大家分享一篇C#使用TcpListener及TcpClient開發(fā)一個(gè)簡(jiǎn)單的Chat工具實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12C#使用WebClient實(shí)現(xiàn)上傳下載
這篇文章介紹了C#使用WebClient實(shí)現(xiàn)上傳下載的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05