Loading...
Borislav_Vulkov avatar Borislav_Vulkov 54 Точки

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 383 Точки
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 756 Точки

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

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

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

:)

0
Borislav_Vulkov avatar Borislav_Vulkov 54 Точки

Здравей, 
ето го и условето: 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 54 Точки

Ет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 383 Точки

Здравей,  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
valio90 avatar valio90 6 Точки

using System;

namespace _7._5Equal_Sums_Left_Right_Position
{
    class Program
    {
        static void Main(string[] args)
        {
            {
                int num = int.Parse(Console.ReadLine());
                int num2 = int.Parse(Console.ReadLine());
                int sum = 0;
                int sum2 = 0;
                int sum3 = 0;
                int broi = 0;
               
                for (int i = num; i <= num2; i++)
                {
                    string toNum = i.ToString();

                    for (int j = toNum.Length - 1; j >= 0; j--)
                    {
                        broi++;
                        char digit = toNum[j];
                         int digitToNum = int.Parse(digit.ToString());
                        //Console.WriteLine(digitToNum);
                        if (broi > 3) //(broi % 2 == 0)
                        {
                            sum += digitToNum;
                        }
                        else if (broi < 3)
                        {
                            sum2 += digitToNum;
                        }
                        else
                        {
                            sum3 += digitToNum;
                        }
                        
                    }

                    if (sum == sum2)
                    {
                        Console.Write(i + " ");
                    }
                    else
                    {
                        if (sum > sum2)
                        {
                            sum2 += sum3;
                            if (sum == sum2)
                            {
                                Console.Write(i + " ");
                            }
                        }
                        else if (sum < sum2)
                        {
                            sum += sum3;
                            if (sum == sum2)
                            {
                                Console.Write(i + " ");
                            }
                        }
                    }
                    broi = 0;
                    sum = 0;
                    sum2 = 0;
                    sum3 = 0;
                }
            }
        }
    }
}

 

0
kabalsky avatar kabalsky 27 Точки

Здравей.

Ето едно решение и от мен.

 

https://pastebin.com/4TTwZu3C

Памет: 13.43 MB
Време: 0.031 s

Поздрави. 

0
25/11/2019 17:44:35
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.