Может кто-нибудь сказать мне, почему это не работает для решения проблемы 8 Project Euler? - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь решить Проект Задача Эйлера 8 . Я все еще новичок в C#, поэтому мне нравится использовать простые задачи и функции, поэтому код довольно длинный. Если я пытаюсь найти четыре соседние цифры, которые дают самые высокие продукты, он работает, но когда я пытаюсь найти 13, это не работает. Строка 10 - это длинное число. 10 означает длинную, а 2 означает короткую.

//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);
                }

            }

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Проблема с вашим кодом в этой строке

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

, так как все эти переменные имеют тип int, их умножение вызывает переполнение целых чисел, и вы не получите правильный результат.

Используйте это:

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;

Или объявите их как длинные в первую очередь.

Примечание: проверено на euler, и результат верный.

1 голос
/ 03 мая 2020

У меня есть пара предложений:

  1. Вместо нескольких объявлений используйте массив, т.е. int[] selected = new int[13];
  2. Вместо того, чтобы каждый раз брать подстроки, преобразуйте его в массив символов, используя ToCharArray() , Это значительно уменьшит длину вашей программы.
  3. Используйте string lo = new string(); и string so = new string(); После внесения этих изменений вы можете просто использовать вложенные циклы for для решения вышеуказанной программы.

PS Если вам нужно подробное решение, пожалуйста, напишите комментарий к этому ответу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...