Софтуерно Инженерство
Loading...
+ Нов въпрос
Borislav_Vulkov avatar Borislav_Vulkov 44 Точки

Nested Loops - Exercise - 05. Equal Sums Left Right Position

Здравейте, 
ще бъда много благодарен ако някй може да помогне с оптимизирането на кода за тази задача. Написани от мен код минава с 100/100 в Judge но не мисля, че е най-правилото решение защото използвам страшно много променливи. Имате ли някакви идеии ?

==========

using System;

namespace EqualSumsLeftRightPosition
{
    class EqualSumsLeftRightPosition
    {
        static void Main()
        {
            int number1 = int.Parse(Console.ReadLine());
            int number2 = int.Parse(Console.ReadLine());
            string number = string.Empty;

            int int1 = 0;
            int int2 = 0;
            int int3 = 0;
            int int4 = 0;
            int int5 = 0;

            char char1;
            char char2;
            char char3;
            char char4;
            char char5;

            string n1 = string.Empty;
            string n2 = string.Empty;
            string n3 = string.Empty;
            string n4 = string.Empty;
            string n5 = string.Empty;

            for (int i = number1; i <= number2; i++)
            {
                number = i.ToString();
                char1 = number[0];
                char2 = number[1];
                char3 = number[2];
                char4 = number[3];
                char5 = number[4];

                n1 = char.ToString(char1);
                n2 = char.ToString(char2);
                n3 = char.ToString(char3);
                n4 = char.ToString(char4);
                n5 = char.ToString(char5);

                int1 = int.Parse(n1);
                int2 = int.Parse(n2);
                int3 = int.Parse(n3);
                int4 = int.Parse(n4);
                int5 = int.Parse(n5);

                if (int1 + int2 == int4 + int5)
                {
                    Console.Write("{0} ", number);
                }
                else
                {
                    if (int1 + int2 > int4 + int5)
                    {
                        int5 += int3;
                        if (int1 + int2 == int4 + int5)
                        {
                            Console.Write("{0} ", number);
                        }
                    }
                    else if (int1 + int2 < int4 + int5)
                    {
                        int1 += int3;
                        if (int1 + int2 == int4 + int5)
                        {
                            Console.Write("{0} ", number);
                        }
                    }
                }
            }
        }
    }
}
========

Подрави,
Боби

 

Тагове:
1
Programming Basics with C#
Iv_Konov avatar Iv_Konov 354 Точки
Best Answer

Здравей,

 

Предлагам ти да вземеш цифрите по вариант 1. Другите  може да ги пробваш също...

number трябва да е във формат string при Вариант 2 и Вариант 3.

 

// dig5.dig4.dig3.dig2.dig1

 

===Вариант 1===

                int dig1 = number % 10;
                int dig2 = number / 10 % 10;
                int dig3 = number / 100 % 10;
                int dig4 = number / 1000 % 10;
                int dig5 = number / 10_000 % 10;

===

 

===Вариант 2=== 

                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());

===

 

===Вариант 3===

                int dig5 = number[0] - '0';
                int dig4 = number[1] - '0';
                int dig3 = number[2] - '0';
                int dig2 = number[3] - '0';
                int dig1 = number[4] - '0';

===

 

Поздрави,

Иван

 

1
15/04/2019 12:30:20
krum_43 avatar krum_43 93 Точки

Не е зле да дадеш точното условие на задачата.Спомням си,че имаше такава задача,но я нямам решена.

Иначе както казват немците"Ende gut-aless Gut".

Щом вземаш 100/100 ?!?

:)

0
Borislav_Vulkov avatar Borislav_Vulkov 44 Точки

Здравей, 
ето го и условето: https://softuni.bg/trainings/resources/officedocument/39532/exercise-problem-descriptions-programming-basics-with-csharp-march-2019/2298
да това, че вземем 100/100 е ок, но не мога да измисля начин с по-просто решение. Както виждаш използвам много променливи и многократно преобразуване от един тип данни в друг и се чудех дали няма по елегантен начин за решение. 

0
viktor.dechev.1 avatar viktor.dechev.1 11 Точки

Иначе можеш избяга от преобразуванията вуобще.Аз лично така сторих , че джъдж мрънкаше за прекомерно памет с тия стрингове и т.н.
=====
using System;

namespace EqualSumsLeftRightPosition
{
    class EqualSumsLeftRightPosition
    {
        static void Main()
        {
            var number1 = int.Parse(Console.ReadLine());
            var number2 = int.Parse(Console.ReadLine());
           var digits = new int[5];



            for (int i = number1; i <= number2; i++)
            {
   
                for (int pos = 0; pos < 5; pos++)
                {
                    digits[pos] = i / (int)Math.Pow(10, pos);
                    digits[pos] %= 10;
                }

               int sum1 = digits[0] + digits[1];
               int sum2 = digits[3] + digits[4];
               int sum3 = Math.Min(sum1, sum2) + digits[2];
               int sum4 = Math.Max(sum1, sum2);

                if (sum1 == sum2 || sum3 == sum4)
                    Console.Write(i + " ");
            }
        }
    }
}
 

2
15/04/2019 14:11:36
Borislav_Vulkov avatar Borislav_Vulkov 44 Точки

Етo какво показва съдиата (Judge):
всичко работи и дава 100/100 но,
1) Представения от мен код:
Памет: 15.82 MB 
Време: 0.093 s
2) Първият вариант предложен от Iv_Konov
Памет: 8.11 MB 
Време: 0.078 s

3) Варианта предложен от viktor.dechev.1
Памет: 15.88 MB 
Време: 0.093 s

Мисля, че единодушно можем да приемем, че варианта на Иван (Iv_Konov) е най-подходящия при решаването на тази задача. 

1
15/04/2019 14:02:22
viktor.dechev.1 avatar viktor.dechev.1 11 Точки

Пардон, направих едит.

0
Iv_Konov avatar Iv_Konov 354 Точки

Здравей,  viktor.dechev.1,

 

Разбира се, и така става, но вероятно предвид стринговането и парсването кодът е на границата на лимита на паметта: Memory: 15.87 MB, т.е. при определени обстоятелства (примерно при натоварване) Съдията може да даде грешка с паметта:

Allowed working time: 0.300 sec. 
Allowed memory: 16.00 MB 
Size limit: 16.00 KB 

Масивите не са от материала на PB..., но щом можеш и знаеш - ползваш и действаш! smiley

 

При следния вариант ползването на паметта е наполовина: Memory: 8.16 MB. 

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

using System;

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

            for (int i = nem1; i <= num2; i++)
            {
                int dig5 = i % 10;
                int dig4 = i / 10 % 10;
                int dig3 = i / 100 % 10;
                int dig2 = i / 1000 % 10;
                int dig1 = i / 10_000 % 10;

                if (dig5 + dig4 == dig2 + dig1)
                {
                    Console.Write(i + " ");
                }
                else if (dig5 + dig4 > dig2 + dig1)
                {
                    if (dig2 + dig1 + dig3 == dig5 + dig4)
                    {
                        Console.Write(i + " ");
                    }
                }
                else if (dig5 + dig4 < dig2 + dig1)
                {
                    if (dig2 + dig1 == dig5 + dig4 + dig3)
                    {
                        Console.Write(i + " ");
                    }
                }
            }
        }
    }
}

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

 

Поздрави,

Иван

 

 

0