簡體   English   中英

C#中的1000位數字

[英]1000 digit number in C#

我正在研究Euler項目 ,遇到了一個問題。

我無法使用1000位數字,並且想知道我是在做錯什么還是只是以錯誤的方式使用此解決方案,如果是的話,最好的方法是什么?

C#

namespace ToThePowerOf
{
    class Program
    {
        static void Main(string[] args)
        {
            BigInteger n = 1;
            int x = 0;
            BigInteger [] number;
            number = new BigInteger[149194];
            number[x] = 1;
            number[x + 1] = 1;
            x = 3; ;
            BigInteger check = 10000000000000000000000000000
                                0000000000000000000000000000000
                                0000000000000000000000000000000
                                0000000000000000000000000000000
                                0000000000000000000000000000000
                                0000000000000000000000000000000
                                0000000000000000000000000000000
                                0000000000000000000000000000000
                                0000000000000000000000000000000
                                00000000000000000000000;

            for (int i = 99; i > 0; i--)
            {
                n = (n - 1) + (n - 2);
                number[x] = n;
                x++;
                if (n > check)
                {
                    Console.WriteLine(x);
                }
            }
        }
    }
}

我猜測您遇到的“問題”(將有助於包含錯誤消息)是編譯器不喜歡具有1000位數字的整數文字,因此您無法使用非常大的整數文字對其進行初始化。 正如其他人指出的那樣,將整數文字分成多行也是無效的。

number[x] = 1; 這些行之所以起作用,是因為編譯器可以處理整數文字1並且因為我們將其分配給BigInteger所以它使用BigInteger隱式運算符將其轉換為BigInteger


解決大整數文字問題的一種簡單方法是使用BigInteger.Parse方法創建1000位數字。

BigInteger check = BigInteger.Parse("10000....", CultureInfo.InvariantCulture);

另一種方法可能是使用一個小的int值對其進行初始化,然后使用數學運算來獲得所需的數字,如Jon Skeet的答案所示

C#中沒有對BigInteger的文字支持。 因此,盡管使用BigInteger並非不正確,但您需要研究一種不同的實例化方法-例如new BigInteger(10).Pow(1000)

這么大的文字是不可能的。 整數文字最多可以為64位。

要獲取較大的biginteger,可以從字符串轉換,也可以計算數字而不是對其進行硬編碼。 在您的情況下,使用BigInteger.Pow(10, digits)是最干凈的解決方案。

我可能真的很晚了,但是我所做的是取每個數字,並使其成為數組中的一個獨立對象。 然后,我將數組的前5個數字相乘並將它們設置為變量。 如果它們大於最大值,則將其設置為最大值。 然后,我繼續進行下一組1-6的數字,並進行了相同的操作,等等。我確實收到了超出范圍的異常。 在這種情況下,請使用嘗試獲取格式,直到收到此異常。 如果您想查看代碼,我將編輯響應,但是為了節省您在陣列上的時間,如果您仍然想嘗試此操作,那么我將為您提供陣列。

 long[] a;
 a = new long[] {
            7,3,1,6,7,1,7,6,5,3,1,3,3,0,6,2,4,9,1,9,2,2,5,1,1,9,6,7,4,4,2,6,5,7,4,7,4,2,3,5,5,3,4,9,1,9,4,9,3,4,
            9,6,9,8,3,5,2,0,3,1,2,7,7,4,5,0,6,3,2,6,2,3,9,5,7,8,3,1,8,0,1,6,9,8,4,8,0,1,8,6,9,4,7,8,8,5,1,8,4,3,
            8,5,8,6,1,5,6,0,7,8,9,1,1,2,9,4,9,4,9,5,4,5,9,5,0,1,7,3,7,9,5,8,3,3,1,9,5,2,8,5,3,2,0,8,8,0,5,5,1,1,
            1,2,5,4,0,6,9,8,7,4,7,1,5,8,5,2,3,8,6,3,0,5,0,7,1,5,6,9,3,2,9,0,9,6,3,2,9,5,2,2,7,4,4,3,0,4,3,5,5,7,
            6,6,8,9,6,6,4,8,9,5,0,4,4,5,2,4,4,5,2,3,1,6,1,7,3,1,8,5,6,4,0,3,0,9,8,7,1,1,1,2,1,7,2,2,3,8,3,1,1,3,
            6,2,2,2,9,8,9,3,4,2,3,3,8,0,3,0,8,1,3,5,3,3,6,2,7,6,6,1,4,2,8,2,8,0,6,4,4,4,4,8,6,6,4,5,2,3,8,7,4,9,
            3,0,3,5,8,9,0,7,2,9,6,2,9,0,4,9,1,5,6,0,4,4,0,7,7,2,3,9,0,7,1,3,8,1,0,5,1,5,8,5,9,3,0,7,9,6,0,8,6,6,
            7,0,1,7,2,4,2,7,1,2,1,8,8,3,9,9,8,7,9,7,9,0,8,7,9,2,2,7,4,9,2,1,9,0,1,6,9,9,7,2,0,8,8,8,0,9,3,7,7,6,
            6,5,7,2,7,3,3,3,0,0,1,0,5,3,3,6,7,8,8,1,2,2,0,2,3,5,4,2,1,8,0,9,7,5,1,2,5,4,5,4,0,5,9,4,7,5,2,2,4,3,
            5,2,5,8,4,9,0,7,7,1,1,6,7,0,5,5,6,0,1,3,6,0,4,8,3,9,5,8,6,4,4,6,7,0,6,3,2,4,4,1,5,7,2,2,1,5,5,3,9,7,
            5,3,6,9,7,8,1,7,9,7,7,8,4,6,1,7,4,0,6,4,9,5,5,1,4,9,2,9,0,8,6,2,5,6,9,3,2,1,9,7,8,4,6,8,6,2,2,4,8,2,
            8,3,9,7,2,2,4,1,3,7,5,6,5,7,0,5,6,0,5,7,4,9,0,2,6,1,4,0,7,9,7,2,9,6,8,6,5,2,4,1,4,5,3,5,1,0,0,4,7,4,
            8,2,1,6,6,3,7,0,4,8,4,4,0,3,1,9,9,8,9,0,0,0,8,8,9,5,2,4,3,4,5,0,6,5,8,5,4,1,2,2,7,5,8,8,6,6,6,8,8,1,
            1,6,4,2,7,1,7,1,4,7,9,9,2,4,4,4,2,9,2,8,2,3,0,8,6,3,4,6,5,6,7,4,8,1,3,9,1,9,1,2,3,1,6,2,8,2,4,5,8,6,
            1,7,8,6,6,4,5,8,3,5,9,1,2,4,5,6,6,5,2,9,4,7,6,5,4,5,6,8,2,8,4,8,9,1,2,8,8,3,1,4,2,6,0,7,6,9,0,0,4,2,
            2,4,2,1,9,0,2,2,6,7,1,0,5,5,6,2,6,3,2,1,1,1,1,1,0,9,3,7,0,5,4,4,2,1,7,5,0,6,9,4,1,6,5,8,9,6,0,4,0,8,
            0,7,1,9,8,4,0,3,8,5,0,9,6,2,4,5,5,4,4,4,3,6,2,9,8,1,2,3,0,9,8,7,8,7,9,9,2,7,2,4,4,2,8,4,9,0,9,1,8,8,
            8,4,5,8,0,1,5,6,1,6,6,0,9,7,9,1,9,1,3,3,8,7,5,4,9,9,2,0,0,5,2,4,0,6,3,6,8,9,9,1,2,5,6,0,7,1,7,6,0,6,
            0,5,8,8,6,1,1,6,4,6,7,1,0,9,4,0,5,0,7,7,5,4,1,0,0,2,2,5,6,9,8,3,1,5,5,2,0,0,0,5,5,9,3,5,7,2,9,7,2,5,
            7,1,6,3,6,2,6,9,5,6,1,8,8,2,6,7,0,4,2,8,2,5,2,4,8,3,6,0,0,8,2,3,2,5,7,5,3,0,4,2,0,7,5,2,9,6,3,4,5,0 
        };

我仍然不確定C#中的BigInteger處理,但是對於您所引用的Project Euler問題,我仍然不確定。 您可以從文本文件中逐個字母地讀取數字並將其轉換為int。 然后進行乘法和檢查。 不優雅,但可以!

有關語法參考,請參見http://msdn.microsoft.com/zh-cn/library/system.io.filestream.aspx

string big = "1";
for (int i = 0; i < 1000-1; i++)
{
    big += "0";
}
BigInteger num = BigInteger.Parse(big);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM