熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C#4.0提供BigInteger類 支持大數運算

2013-11-13 09:47:14  來源: .NET編程 

  前段時間有個同事說

  

  

  

  

  

  是個質數

  直覺告訴我光是在中間加幾個在後面加個估計不是質數

  有很多面試題都會要面試者去做一些關於大數的運算例如在這裡就有判斷上面這個數是不是質數的情況

  很明顯Integer Long都是不能來處理如此巨大的數的

  在net framework SystemNumericsdll 中提供了BigInteger 類使用這個類可以很方便的解決這個問題

  判斷n是質數的方法

  如果是偶數肯定不是質數

  如果能夠被小於或等於Sqrt(n) 的數除盡則不是質數

  代碼如下



private static bool IsPrime()
{
    string largeNumber = @;
    BigInteger bigInteger = BigIntegerParse(largeNumber);
    if (bigIntegerIsEven)
    {
        return false;
    }
    for (BigInteger bi = ; BigIntegerPow(bi ) <= bigInteger; bi += )
    {
        if (bigInteger % bi == )
        {
            return false;
        }
    }
    return true;
}

  本來for 循環中的代碼應該是



for (BigInteger bi = ; bi <= BigIntegerSqrt(bigInteger); bi += )
{
    if (bigInteger % bi == )
    {
        return false;
    }
}  

  可惜的是BigInteger 不支持Sqrt方法所以換用



for (BigInteger bi = ; BigIntegerPow(bi ) <= bigInteger; bi += )

   結果如下圖

  可以知道…………………………不是質數可以被除盡

  C語言中有道經典的題目是求!後面有幾個

  如果你不知道BigInteger的話應該怎麼做?

  ! 可以理解為 

  

  因為偶數比要多所以i值比j值多很多所以求!有多少個可以認為是求j的值 

  當然也可以用公式

  Sum = [/]+[/(^)]+[/(^)]=++=;

  如果你既沒有思路也沒有公式腦子裡面只有一個念頭****** 的for循環然後統計的數量的話 中也可以實現雖然好像速度慢了點不過也還是可以得到答案的

  代碼如下

  

  統計的代碼如下

  運行結果如下



int count = ;
for (int i = strSumLength ; i >= ; i)
{
    if (strSum[i] == )
    {
        count++;
    }
    else
    {
        break;
    }
}

  

  還有很多使用大數的運算的地方都等待著你的發揮!


From:http://tw.wingwit.com/Article/program/net/201311/11584.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.