Проблем при задача в 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");
пак ми дава грешка
Това е защото първо трябва да се проверят всички възможни комбинации от числа и ако няма нито една тройка отговаряща на условието a + b = c, тогава да се отпечата "No". Проверих в Judge-а - дава 100 точки като изнесеш проверката извън циклите.
if (res == false) не е много четимо и не се препоръчва от гледна страна на качествения код.
if(!res) ето така се прави.
А да сме по точни името на променливата трябва да е нещо от сорта на: if(!haveSum).
Просто давам препоръка ;)
Опитвам се да реша задачата по алтернативен начин без 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");
}
}
}
}
Къде бъркам ?
Благодаря Ви предварително.
Гледам че в резултата принтираш два пъти равно, примерно 5+5==10. Би трябвало да е само 1 равно(5+5=10). Не съм тествал, просто предполагам че е така.
Равното трябва да си е два пъти, така е по условие. Проблема идва някъде от средния фор цикъл и приверката дали сумата е равна на някое число от масива. Сега се опитвам и аз да намеря къде е грешката.
Гледам решение с Method представено от Г-н Наков на 18.03.2016.
За да не пълня форуме ето линк към кода: http://pastebin.com/1pVhCs6J
Гледам метод блока прави почти същото и Judge много му се кефи на това решение и дава 100/100.
Моят код, обаче не работи.
Важно е да рабера къде бъркам, понеже подобна скрита за мен грешка може да ме издъни.
Колега открих грешката, в if след Console.ReadLine(); трябва да му дадеш break; - чупиш го, да излезе един вид. и дава 100 точки.
Колега 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 5 6 6 със break; и след това без break; и ще видиш разликата. Така ще разбереш най-добре.
Защото ако има повече от 1 число равно на сумата ще го изпринтира толкова пъти :
пример :
1 2 3 4 3
1 + 2 == 3
1 + 2 == 3
А трябва да го принтне веднъж затова трябва да го break-неш при намиране на първото равенство.
Т.е. до колкото разбирам проблем възниква при наличие на 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-вото изпълнено условие.
Благодаря Ви.
При мене още в началото ми дава грешка,когато изписвам
var nums = Console.ReadLine().Split(' ').Select(int.Parse).ToArray ;
и дебъгера ми отговаря
Error 1 The type arguments for method 'System.Linq.Enumerable.Грешка 1 аргументи от типа, за метод "System.Linq.Enumerable.Select
Решението ти е правилно. Условието не е дописано.
Да, трябва да го покаже два пъти, защото: "find all triples of elements a, b and c"
Липсват ти скобите накрая.
var nums = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
Може ли да дадеш линк към условието на задачата.