C# 4.0 大數(shù)的運算--BigInteger的應用詳解
“30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000001”
是個質數(shù)。
直覺告訴我,光是在中間加幾個0,在后面加個1,估計不是質數(shù)。
有很多面試題,都會要面試者去做一些關于大數(shù)的運算,例如在這里就有判斷上面這個數(shù)是不是質數(shù)的情況。
很明顯,Integer ,Long都是不能來處理如此巨大的數(shù)的。
在.net framework 4.0中,System.Numerics.dll 中提供了BigInteger 類。使用這個類可以很方便的解決這個問題。
判斷n是質數(shù)的方法:
1:如果是偶數(shù),肯定不是質數(shù)
2:如果能夠被小于或等于Sqrt(n) 的數(shù)除盡,則不是質數(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)中的代碼應該是
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”不是質數(shù),可以被13除盡。
2:C語言中有道經(jīng)典的題目是求100!后面有幾個0.
如果你不知道BigInteger的話,應該怎么做?
100! 可以理解為
因為偶數(shù)比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循環(huán),然后統(tǒng)計0的數(shù)量的話,在4.0 中也可以實現(xiàn),雖然好像速度慢了點,不過也還是可以得到答案的:
代碼如下:
統(tǒng)計的代碼如下:
運行結果如下:
int count = 0;
for (int i = strSum.Length - 1; i >= 0; i--)
{
if (strSum[i] == '0')
{
count++;
}
else
{
break;
}
}
還有很多使用大數(shù)的運算的地方,都等待著你的發(fā)揮!
相關文章
C#?彈出窗口show()和showdialog()的兩種方式
本文主要介紹了C#?彈出窗口show()和showdialog()的兩種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07c#中winform根據(jù)郵箱地址和密碼一鍵發(fā)送email的實現(xiàn)
本文主要介紹了c#winform根據(jù)郵箱地址和密碼一鍵發(fā)送email的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07C#使用TcpListener及TcpClient開發(fā)一個簡單的Chat工具實例
下面小編就為大家分享一篇C#使用TcpListener及TcpClient開發(fā)一個簡單的Chat工具實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12