Loading...
jish91 avatar jish91 3 Точки

Проблем при задача в judge "Tripple Sum"

int[] arr = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();

            var res = false;
            for (int i = 0; i < arr.Length; i++)
            {
                for (int j = i + 1; j < arr.Length; j++)
                {
                    int a = arr[i];
                    int b = arr[j];
                    int sum = a + b;
                    if (arr.Contains(sum))
                    {
                        Console.WriteLine("{0} + {1} == {2}", a, b, sum);
                        res = true;
                    }
                }
                if (res == false)
                    Console.WriteLine("No");
            }

така ми дава грешка когато няма отговори.

като закоментирам  if (res == false)
                                   Console.WriteLine("No");

пак ми дава грешка

Тагове:
0
Общи приказки 22/03/2016 10:23:13
krokicha avatar krokicha 76 Точки

if (res == false)
  Console.WriteLine("No");

трябва да е извън циклите.

1
krokicha avatar krokicha 76 Точки

Това е защото първо трябва да се проверят всички възможни комбинации от числа и ако няма нито една тройка отговаряща на условието a + b = c, тогава да се отпечата "No". Проверих в Judge-а - дава 100 точки като изнесеш проверката извън циклите.

1
g.stoyanov avatar g.stoyanov 776 Точки

if (res == false) не е много четимо и не се препоръчва от гледна страна на качествения код.

if(!res) ето така се прави.

А да сме по точни името на променливата трябва да е нещо от сорта на: if(!haveSum).

 

Просто давам препоръка ;)

2
i.minchev.qa avatar i.minchev.qa 34 Точки

Опитвам се да реша задачата по алтернативен начин без Contains.

Съгласно резултатите в Slide 18 of 44 от презентацията всичко е "ток и жица" - TEST OK!!!

Според Judge обаче, съм прав наполовина и малко отгоре - резултат 60/100

Кодът е:

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

namespace TrippleSumForLoop_10._05._2016
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] nums = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
            bool isSumEqual = false;
            int sum = 0;

            for (int left = 0; left < nums.Length; left++)
            {
                for (int right = left + 1; right < nums.Length; right++)
                {
                    sum = nums[left] + nums[right];

                    for (int i = 0; i < nums.Length; i++)
                    {

                        if (sum == nums[i])
                        {
                            isSumEqual = true;
                            Console.WriteLine("{0} + {1} == {2}", nums[left], nums[right], sum);
                        }                        
                    }
                }
            }
            if (!(isSumEqual))
            {
                Console.WriteLine("No");
            }           
        }
    }
}

Къде бъркам ?

Благодаря Ви предварително.

 

0
Nikola_Andreev avatar Nikola_Andreev 671 Точки

Гледам че в резултата принтираш два пъти равно, примерно 5+5==10. Би трябвало да е само 1 равно(5+5=10). Не съм тествал, просто предполагам че е така.

0
borislav9212 avatar borislav9212 745 Точки

Равното трябва да си е два пъти, така е по условие. Проблема идва някъде от средния фор цикъл и приверката дали сумата е равна на някое число от масива. Сега се опитвам и аз да намеря къде е грешката.

1
i.minchev.qa avatar i.minchev.qa 34 Точки

Гледам решение с Method представено от Г-н Наков на 18.03.2016.

За да не пълня форуме ето линк към кода: http://pastebin.com/1pVhCs6J

Гледам метод блока прави почти същото и Judge много му се кефи на това решение и дава 100/100.

Моят код, обаче не работи.

Важно е да рабера къде бъркам, понеже подобна скрита за мен грешка може да ме издъни.

 

1
borislav9212 avatar borislav9212 745 Точки

Колега открих грешката, в if след Console.ReadLine(); трябва да му дадеш break; - чупиш го, да излезе един вид. и дава 100 точки.

2
i.minchev.qa avatar i.minchev.qa 34 Точки

Колега borsilav9212, огън си.

За всички коригиран код Ver.2.0:

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

namespace TrippleSumForLoopV2_10._05._2016
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] nums = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
            bool isSumEqual = false;            

            for (int left = 0; left < nums.Length; left++)
            {
                for (int right = left + 1; right < nums.Length; right++)
                {
                    int sum = nums[left] + nums[right];

                    for (int i = 0; i < nums.Length; i++)
                    {
                        if (nums[i] == sum)
                        {                            
                            Console.WriteLine("{0} + {1} == {2}", nums[left], nums[right], sum);
                            
                            isSumEqual = true;
                            break; // ADDED BRAKE IN ROW 29
                        }
                    }

                }
            }
            if (!(isSumEqual))
            {
                Console.WriteLine("No");
            }
        }
    }
}

Т.к. judge не дава информация относно input, Must be: Output, Real is: Output(Wrong) сега Ви моля да ми помогнете да си обясня защо липсата този "break;" в if цикъл чупи програмата?

Благодаря Ви предварително.

1
10/05/2016 13:42:16
borislav9212 avatar borislav9212 745 Точки

Въведи ето този пример: 1 5 6 6 със break; и след това без break; и ще видиш разликата. Така ще разбереш най-добре.

1
kaloyannikov avatar kaloyannikov 531 Точки

Защото ако има повече от 1 число равно на сумата ще го изпринтира толкова пъти : 

пример :

1 2 3 4 3 

1 + 2 == 3

1 + 2 == 3

А трябва да го принтне веднъж затова трябва да го break-неш при намиране на първото равенство.

1
i.minchev.qa avatar i.minchev.qa 34 Точки

Т.е. до колкото разбирам проблем възниква при наличие на 2 еднакви числа в масива.

При примерна комбинация 1 5 6 6 :

step 1 : left = 0; right = 1; i = 2; => (nums[left]) 1 + (nums[right]) 5 = (numbs[2]) 6;

step 2 : left = 0; right = 1; i = 3; => (nums[left]) 1 + (nums[right]) 5 = (numbs[3]) 6;

Сценарий 1 - няма break:  изпълнение на spep1 и step 2 и отпечатване на резултатите без значение че е един и същ т.к. елемнти 2 и 3 на масива са равни.

Сценарий 2 - има break: изпълнение на step 1, изпълнено е условието, предотвратява се изпълнението на всякакви следващи стъпки с команда - break;

Заключение: Реално спираме итератор i  когато срещнем 1-вото изпълнено условие.

Благодаря Ви.

1
10/05/2016 16:34:14
Konstantin_Kosev avatar Konstantin_Kosev 12 Точки

При мене още в началото ми дава грешка,когато изписвам

var nums = Console.ReadLine().Split(' ').Select(int.Parse).ToArray ;

и дебъгера ми отговаря

Error    1    The type arguments for method 'System.Linq.Enumerable.Грешка 1 аргументи от типа, за метод "System.Linq.Enumerable.Select

 

0
WifiAvivi avatar WifiAvivi 151 Точки

Опитвам се да реша задачата по алтернативен начин без Contains.

Съгласно резултатите в Slide 18 of 44 от презентацията всичко е "ток и жица" - TEST OK!!!

Според Judge обаче, съм прав наполовина и малко отгоре - резултат 60/100

 

Решението ти е правилно. Условието не е дописано.

пример :

1 2 3 4 3 

1 + 2 == 3

1 + 2 == 3

Да, трябва да го покаже два пъти, защото: "find all triples of elements a, b and c"

0
08/09/2016 16:18:33
WifiAvivi avatar WifiAvivi 151 Точки

При мене още в началото ми дава грешка,когато изписвам

var nums = Console.ReadLine().Split(' ').Select(int.Parse).ToArray ;

Липсват ти скобите накрая.

var nums = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();

0
08/09/2016 16:25:06
vancho avatar vancho 430 Точки

Може ли да дадеш линк към условието на задачата.

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