Професионална програма
Loading...
+ Нов въпрос
axl894 avatar axl894 38 Точки

[Exam Problem] C# Basics Sum of Elements

Здравейте, реших задачата, като уж минава всички тестове, но в системата за оценяване ми дава 58 точки и Runtime error. Това е условието:

You are given n numbers. Find an element that is equal to the sum of all of the other elements.

Input
Input data should be read from the console.
At the only line in the input a sequence of integers stays (numbers separated one from another by a space).
The input data will always be valid and in the format described. There is no need to check it explicitly.

Output
The output data must be printed on the console. At the only line of the output print the result.
Print "Yes, sum=…" if there is an element that is equal to the sum of all other elements, along with this sum.
Print "No, diff=…" if there is no element that is equal to the sum of all other elements. Print also the minimum possible difference between an element from the sequence and the sum of all other elements (always a positive number).

А това е моят код:

http://pastebin.com/L8GMzPbi

Тагове:
0
Programming Basics 07/12/2014 17:12:36
mihayloff14 avatar mihayloff14 825 Точки
Best Answer

Когато не знаеш какво не ти е наред в кода можеш да провериш всички тестове, които прави judge системата. Просто изтегли съответния вариант на изпита от страницата с курса от март месец ето ТУК

В случая, конкретния изпит е вариант 3.

Проблема в твоя код е, че при input-ване на големи стойности, получаваш StackOverflow Exception. Решението е всички променливи да са от тип long, а не int, за да си сигурен, че няма да се получи този exception.

 Трябва да внимаваш при такива задачи, защото input-а ти от конзолата е серия от integer-и, а не само един. В случая, когато се въведе да речем 2 000 000 000 и 2 000 000 000, те се побират в array-а ти, но когато изведеш numbers.Sum(), числото което се получава е 4 000 000 000 и това не се побира в данни от тип int.

5
Filkolev avatar Filkolev 4482 Точки

Като казваш, че минава всички тестове, предполагам имаш предвид, че с дадените в условието примери всичко е наред. Само че понякога тези примери са малко подвеждащи, защото не покриват всички случаи, обикновено граничните, когато някои или всички от входните данни са на максимума. И на мен ми се случи нещо подобно на друга задача; решението ми си работеше идеално - с входните данни, дадени в примерите. За почти всички останали случаи не работеше и то по същата причина, поради която и на теб ти излизат грешни отговори.

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

Иначе грешката ти мисля, че я видях. Имаш ето това условие: "All input numbers are integers in the range [0 … 2 000 000 000]." Т.е. препълваш сумата, която си задал като int. 

 

1
axl894 avatar axl894 38 Точки

Благодаря ви много, сега и аз си видях грешката. Искам да попитам това значи ли, че специално за изпита е по-добре в такива задачи променливите ми да са от тип long и така един вид да се презастраховам от такова нещо? Или така рискувам да премина времевото ограничение, за което програмата трябва да се изпълни?

0
Filkolev avatar Filkolev 4482 Точки

От всички задачи, които реших към момента, нито една не беше дори близо да премине границата от време за работа. По-близо бях с паметта при една задача, така че опасността е минимална.

По-скоро, гледай си условията, колко числа имаш, в какъв диапазон са и какви действия извършваш с тях и на база това мисли дали няма опасност да препълниш. В тази задача имаш потенциално 1000 числа, всяко от които може да е 2 000 000 000 (не съм гледал, но нищо чудно един от тествовете да е именно такъв случай). Еми, както колегата писа по-горе, възможно е още с 2 събираеми да препълниш int-a, 2 000 000 000 е твърде близо до максималното за този тип данни. 

0
mihayloff14 avatar mihayloff14 825 Точки

Да, аз препоръчвам когато искаш да декларираш цяло число за изпита, да го правиш в тип Long. Никакъв шанс няма да препълниш възможната памет. Естествено, стига да не си въвел цяла дузина ненужни неща.

Дори един от лекторите, който водеше лекция за подготовка за изпита каза, че лично той винаги си е слагал променливите в тип Long като застраховка.

От друга страна, в някои задачи трябва да внимаваш да не прехвърлиш допустимото време за работа. На мен ми се е случвало често и по принцип това се получава, когато извършваш сложни операции или цикли от сорта на "от 0 до 999999999".

0
pataroka avatar pataroka 319 Точки

А на някой прави ли му впечатление, че авторското решение на задачата изкарва 83/100 на Judge?

1
mitttt avatar mitttt 4 Точки

Да наистина толкова точки дава на авторското решение. И при моя начин беше така, докато не промених сумата от останалите елементи  в тип long. След това изкара 100/100.

0
19/03/2015 19:04:32