Професионална програма
Loading...
kirildodov avatar kirildodov 0 Точки

Nested Loops - Exercise

Здравейте!

Имам проблем със задача 05. Equal Sums Left Right Position (Еднакви суми на леви и десни позиции). Zero тестовете ми минават, но Judge ми дава 80/100, като на два от тестовете ми изписва: Test #6 (Memory limit) и Test #8 (Memory limit). Номера на решението е следния: Solution #10731877. Ето и кода ми, моля да помогнете - къде бъркам?

 

using System;

namespace _05._Equal_Sums_Left_Right_Position
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            int m = int.Parse(Console.ReadLine());

            for (int i = n; i <= m; i++)
            {
                int leftSum = 0;
                int rightSum = 0;
                int midDigit = 0;
                for (int j = 0; j < 5; j++)
                {
                    string number = i.ToString();
                    char currentSymbol = number[j];
                    int currentDigit = int.Parse(currentSymbol.ToString());

                    if (j == 0 || j == 1)
                    {
                        leftSum += currentDigit;
                    }
                    else if (j == 3 || j == 4)
                    {
                        rightSum += currentDigit;
                    }
                    else if (j == 2)
                    {
                        midDigit = currentDigit;
                    }

                }
                if (leftSum == rightSum)
                {
                    Console.Write(i + " ");
                }
                else
                {
                    if (leftSum < rightSum)
                    {
                        leftSum += midDigit;
                        if (leftSum == rightSum)
                        {
                            Console.Write(i + " ");
                        }
                    }
                    else if (rightSum < leftSum)
                    {
                        rightSum += midDigit;
                        if (leftSum == rightSum)
                        {
                            Console.Write(i + " ");
                        }
                    }
                }
            }
        }
    }
}
 

Тагове:
0
Programming Basics
Iv_Konov avatar Iv_Konov 384 Точки
Best Answer

Здравей,

поопростих кода и - 100/100, но има голяма вероятност при тест през следващите дни да ти мине кода коректно и без моите '"корекции".

Примерно един и същ код ми минава днес така:

Memory: 15.80 MB 
Time: 0.031 s

а в неделя:

Memory: 9.38 MB 
Time: 0.031 s

=================================

for (int i = n; i <= m; i++)
            {
                int leftSum = 0;
                int rightSum = 0;
                int midDigit = 0;
                string number = i.ToString();

                //char currentSymbol = number[j];
                //int currentDigit = int.Parse(currentSymbol.ToString());

                int dig5 = int.Parse(number[0].ToString()); // няма смисъл от цикъл - от раз имаш цифрите
                int dig4 = int.Parse(number[1].ToString());
                int dig3 = int.Parse(number[2].ToString());
                int dig2 = int.Parse(number[3].ToString());
                int dig1 = int.Parse(number[4].ToString());

                leftSum = dig5 + dig4;
                rightSum = dig2 + dig1;
                midDigit = dig3;

                //if (j == 0 || j == 1)
                //{
                //    leftSum += currentDigit;
                //}
                //else if (j == 3 || j == 4)
                //{
                //    rightSum += currentDigit;
                //}
                //else if (j == 2)
                //{
                //    midDigit = currentDigit;
                //}


                if (leftSum == rightSum)
                {
                    Console.Write(number + " "); // категорично 90/100 беше точно от изобра на променливата i вместо number, но нямам обяснение... smiley
                }
                else if (leftSum < rightSum)
                {
                    leftSum += midDigit;
                    if (leftSum == rightSum)
                    {
                        Console.Write(number + " ");
                    }
                }
                else if (rightSum < leftSum)
                {
                    rightSum += midDigit;
                    if (leftSum == rightSum)
                    {
                        Console.Write(number + " ");
                    }
                }
            }

 

Поздрави,

Иван

0
25/03/2019 16:25:51
Iv_Konov avatar Iv_Konov 384 Точки

p.s. Още една идея - дори работи по-оптимално - паметта е намалена двойно - Memory: 8.21 MB. 

Вместо да се ползва стринговане и парсване взимаш цифрите по стандартен начин и отново 100/100:

  string number = i.ToString();

  int dig5 = int.Parse(number[0].ToString());

В началото исках да ти запзая твоята идея, но явно ползва повече памет...

 

                int dig5 = i % 10;
                int dig4 = i / 10 % 10;
                int dig3 = i / 100 % 10;
                int dig2 = i / 1_000 % 10;
                int dig1 = i / 10_000 % 10;

 

Поздрави,

Иван

0