Loading...
Angmar avatar Angmar 1 Точки

Проблем при решаване на задача From Left to the Right от More Exercise: Data Types and Variables

Отново се сблъсках със задача, която не мога да реша с инструментите(знанията), с които разполагам. Предполагам, че с масиви ще е значително по-лесно но задачата е от блока с променливите и според мен може да се реши и така. Въпроса е че ми гърми като рънтайм ерър и според мен имам грешка с типа на променливите, тестовете от заданието минават с long, пробвах за всеки случай с BigInt но не е от това.

You will receive number which represent how many lines we will get as an input. On the next N lines, you will receive a string with 2 numbers separated by single space. You need to compare them. If the left number is greater than the right number, you need to print the sum of all digits in the left number, otherwise print the sum of all digits in the right number.

Examples

Input

Output

2

1000 2000

2000 1000

2

2

4

123456 2147483647

5000000 -500000

97766554 97766554

9999999999 8888888888

46

5

49

90

Това е решението, което измислих (може и логиката да е грешна)

using System;

namespace _02.FromLeftToRight
{
    class Program
    {
        static void Main()
        {
            byte numberOfInputs = byte.Parse(Console.ReadLine());

            for (int i = 1; i <= numberOfInputs; i++)
            {
                byte breakIndex = 0;
                string leftNumber = "";
                string rightNumber = "";
                string input = Console.ReadLine();

                for (byte nl = 0; nl <= input.Length - 1; nl++)
                {
                    if (input[nl] == ' ')
                    {
                        breakIndex = (byte)(nl + 1);
                        break;
                    }
                    else
                    {
                        string nSymbol = input[nl].ToString();
                        leftNumber = leftNumber + nSymbol;
                    }
                }
                for (int nr = breakIndex; nr <= input.Length - 1; nr++)
                {
                    string nSymbol = input[nr].ToString();
                    rightNumber = rightNumber + nSymbol;
                }

                long leftNumberToInt = long.Parse(leftNumber);
                long rightNumberToInt = long.Parse(rightNumber);

                if (leftNumberToInt > rightNumberToInt)
                {
                    int sumLeft = 0;
                    for (int j = 0; j <= leftNumber.Length - 1; j++)
                    {
                        string nSymbol = leftNumber[j].ToString();
                        byte nNumber = byte.Parse(nSymbol);
                        sumLeft += nNumber;
                    }
                    Console.WriteLine(sumLeft);
                }
                else
                {
                    int sumRight = 0;
                    for (int k = 0; k <= rightNumber.Length - 1; k++)
                    {
                        string nSymbol = rightNumber[k].ToString();
                        byte nNumber = byte.Parse(nSymbol);
                        sumRight += nNumber;
                    }
                    Console.WriteLine(sumRight);
                }
            }
        }
    }
}

Тагове:
0
C# Fundamentals
nickwork avatar nickwork 657 Точки

Виждам, че решението ти дава верни отговори...judge малко се чупи точно на тази задача, не знам защо. Пращам ти моето решение което е дало 100/100. Иначе логиката ти е вярна...малко е сложна за такава задача, но видях, че е от more Exercise и сигурно за това я пишеш по този начин...трябват малко по други знания, иначе се решава точно на един ред, но judge пак не я приема :)

 

Вариант 100/100

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Numerics;
using System.Threading.Tasks;

namespace _02.From_Left_to_The_Right
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            for (int i = 0; i < n; i++)
            {
                long[] arr = Console.ReadLine().Split(' ').Select(long.Parse).ToArray();
                long sumOfDigits = 0;
                if (arr[0] > arr[1])
                {
                    long currentNum = arr[0];
                    while (currentNum != 0)
                    {
                        sumOfDigits += currentNum % 10;
                        currentNum /= 10;
                    }
                }
                else
                {
                    long currentNum = arr[1];
                    while (currentNum != 0)
                    {
                        sumOfDigits += currentNum % 10;
                        currentNum /= 10;
                    }
                }
                Console.WriteLine(Math.Abs(sumOfDigits));
            }
        }
    }
}

 

Съкратен вариант:

using System;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int lines = int.Parse(Console.ReadLine());

            for (int i = 0; i < lines; i++)
            {
                Console.WriteLine(Console.ReadLine().Split().Select(long.Parse).ToArray().Max().ToString()
                    .Where(x => char.IsDigit(x)).ToArray().Sum(x=> int.Parse(x.ToString())));
            }
        }
    }
}

 

0
05/06/2020 14:22:57
deni.panov avatar deni.panov 15 Точки

Здравей,

погледнах решението ти и мога да ти дам някои хинтове, тъй като предполагам не се интересуваш от готово решение (не това е смисълът). Идеята да брейкнеш фор-а когато получиш ' ' не е лоша, но потенциален проблем може да бъде някой останъл спейс или направо инпут, който започва със спейс (тогава ще гръмне още при парсването на leftNumberToInt). Разгледай документацията за метода split (https://docs.microsoft.com/bg-bg/dotnet/csharp/how-to/parse-strings-using-split) и обърни внимание на StringSplitOptions.RemoveEmptyEntries. Не знам дали има такъв кейс, но какво ще стане ако ти се подаде дробно число? Съществува и вероятността да имаш твърде много разклонения в кода (if-else проверки) и това да е причината за RunTimeError-a.

Надявам се насоките да помогнат. Фактът че решаваш задачи от MoreExercises е показателен за амбицията ти да разбереш материала, а самият им смисъл е да те накарат сам да търсиш допълнителни начини да решиш дадения проблем или .. както казваше един от лекторите ни "... целта е да се научите да търсите в Google". Не се плаши на масивите и продължавай да решаваш колкото се може повече задачи.

Успех! 

0
nickwork avatar nickwork 657 Точки

Проблема на решението е ,че не се проверява за знак минус при обработката на числата, ако ни подадът положително и отрицателно число - всичко работи добре защото пресмятаме сумата на цифрите само на положителното (там няма знак минус), но ако ни подадът 2 отрицателни - то тогава знака минус никъде не изчезва и при итерациите ние се мъчим да го парснем..трябва да се вкара проверка която да следи че подаденият чар е цифра, а не знак минус - тогава ще даде 100/100

1
arto57 avatar arto57 4 Точки

Още едно решение 100/100.

https://pastebin.com/959kGzbd

 

 

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