簡體   English   中英

誰能告訴我為什么這不能解決 Project Euler 的問題 8?

[英]Can anyone tell me why this doesn't work to solve Problem 8 of Project Euler?

我正在嘗試解決 Project Euler Problem 8 我對 C# 還是很陌生,所以我喜歡使用簡單的任務和函數,這就是代碼很長的原因。 如果我嘗試找到給出最高產品的四個相鄰數字它可以工作,但是當我嘗試找到 13 它不起作用。 字符串 lO 是長數字。 lO 表示長一號,sO 表示短一號。

//Problem 8
            string lO = 
            string sO = "";
            int length = lO.Length;
            int uno = 0;
            int dos = 0;
            int tre = 0;
            int fou = 0;
            int fiv = 0;
            int six = 0;
            int sev = 0;
            int eig = 0;
            int nin = 0;
            int ten = 0;
            int ele = 0;
            int twe = 0;
            int thi = 0;
            long big = 0;
            long total = 0;
            int sub = 0;
            for (int i = 0; i < length; i++)
            {
                sub = length - i;
                if (sub > 13)
                {
                    sO = lO.Substring(i, 13);
                }
                else
                {
                    sO = lO.Substring(i, sub);
                }
                if (sO.Length >= 13)
                {
                    uno = Convert.ToInt32(sO.Substring(0, 1));
                    dos = Convert.ToInt32(sO.Substring(1, 1));
                    tre = Convert.ToInt32(sO.Substring(2, 1));
                    fou = Convert.ToInt32(sO.Substring(3, 1));
                    fiv = Convert.ToInt32(sO.Substring(4, 1));
                    six = Convert.ToInt32(sO.Substring(5, 1));
                    sev = Convert.ToInt32(sO.Substring(6, 1));
                    eig = Convert.ToInt32(sO.Substring(7, 1));
                    nin = Convert.ToInt32(sO.Substring(8, 1));
                    ten = Convert.ToInt32(sO.Substring(9, 1));
                    ele = Convert.ToInt32(sO.Substring(10, 1));
                    twe = Convert.ToInt32(sO.Substring(11, 1));
                    thi = Convert.ToInt32(sO.Substring(12));
                }
                total = uno * dos * tre * fou * fiv * six * sev * eig * nin * ten * ele * twe * thi;
                //Console.WriteLine("Total: " + total);
                if (total > big)
                {
                    big = total;
                    Console.WriteLine("New biggest is " + big);
                }

            }

您的代碼的問題是這一行

total = uno * dos * tre * fou * fiv * six * sev * eig * nin * ten * ele * twe * thi;

由於所有這些變量都是int類型,因此將它們相乘會導致 integer 溢出並且您不會得到正確的結果。

用這個:

total = (long)uno * (long)dos * (long)tre * (long)fou * (long)fiv * (long)six * (long)sev * (long)eig * (long)nin * (long)ten * (long)ele * (long)twe * (long)thi;

或者首先聲明它們。

注意:在歐拉上測試,結果是正確的。

我有幾個建議:

  1. 使用數組而不是多個聲明,即int[] selected = new int[13];
  2. 與其每次都使用子字符串,不如使用ToCharArray()將其轉換為字符數組。 這將顯着減少程序的長度。
  3. 使用string lo = new string(); string so = new string(); 完成這些更改后,您可以簡單地使用嵌套的 for 循環來解決上述程序。

PS如果您需要詳細的解決方案,請輸入對此答案的評論。

暫無
暫無

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

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