[Lab] C# Advanced Debuging lab проблем с задача InstructionSet
Здравейте колеги,вчера се пробвах в състезанието за дебъгване в judge системата.Първите няколко кода,които качих наистина не работеха както трябва,но последният код ,който качих си работи перфектно в VS,но в judge системата ми гърми изцяло.Въпросът ми е къде бъркам?Ето това е моята версия
http://pastebin.com/qe7esZy0
ModEdit: Моля преди да пускаш нови теми прочети правилата на форума - по-конкретно т.9 и т.12
Благодаря много за критиката :) Казаното от вас много ме радва,защото разбирам,че почти съм се справил със задачата,което за мен означава много :) За напред ще се опитвам да обръщам повече внимание на такива "малки" детайли :) Поздрави
Правенето на всяка променлива на BigInteger е overkill. При положение, че двата операдна могат да бъдат най-много int.MaxValue, то операндите е достатъчно да са int, а резултатът е достатъчно да побира int.MaxValue на квадрат, т.е.long. Ако никъде по кода не увеличаваш или амаляш операндите би трябвало да проработи. Сигурни ли сте, че само с long-ове не става?
Здравей RoYal,
честно казано и на мене ми е много странно, и започвам да се чудя дали подадените числа са не са int, или пък в
а = b + c всъщност b + c не правят едно число по-голямо от int, и чак след това го присвояват на a.
Ако направя само BigInteger result = 0; или long result = 0;, и оставя всички операнди да са int - judge дава 0 точки.
Направиха ми впечатление още две подробности: написах var x = operandOne + 1; за да проверя типа данни на operandOne + 1, и като сложа курсора на var, чета 32-bit signed integer (което ще рече че при int.MaxValue + 1 резултата се чупи още преди да е присвоен?!
Виктор е измислил нещо любопитно: result = (long)(operandOne * operandTwo); или в моя вариант става
BigInteger result = 0;
result = (BigInteger)(operandOne * operandTwo);
И ReSharper ми посивява това (BigInteger) и пише Type cast is redundant - това ако значи че int.MaxValue * int.MaxValue си остава int (т.е. съвсем погрешен резултат от умножението) и чак после се каства към BigInteger - това би обяснило защо ако само резултата е long или BigInteger, а операндите са int - резултата от изчисленията е грешен и judge дава 0 точки? Ти какво мислиш?
Да, така е наистина - резултатът от два 32bit integer-а е нов 32bit integer. Тук решението е като това, когато искаш да разделиш две целочислени числа и да получиш число с плаваща запетая. Достатъчно е единият аргумент да е кастнат към по-големия тип - не е нужно да е деклариран като такъв тип.
var x = int.MaxValue;
var y = int.MaxValue;
long result = 0;
result = x + (long)y;
Console.WriteLine(result);
Ако целият експрешън се кастне към по-големия тип (long)(x + y) - това означава първо да се извърши събирането, т.е. да се получи -2 и след това -2 да се присвои към long. Стойността му няма да се промени и ще остане -2, т.е. грешната.
Здрасти пак,
прав си че ако навсякъде се кастне единия операнд към long пак си дава 100 точки, ама съвсем навсякъде, включително при result = (long)operandOne - 1;, за да се избегне int.MaxValue - 1 явно.
Здравейте ! Някой има ли представа какви са тестовете след нулевите ? Какви числа са и в какъв ред се въвеждат ? Минавам нулевите и още на първия гърми . Ето го кода http://pastebin.com/FtCHUwXy . Така и немога да разбера къде е проблема . Накрая сложих double и пак гърми . Някакви идеи или критики към кода ?
Благодаря !
Здравей Николай,
не знам какви са тестовете, но понеже в задачата има условие:
тествах програмата ти с този пример - това е output-a на твоята програма:
MLA 2147483647 2147483647
4.61168601413242E+18
END
Press any key to continue . . .
а това печата като output моята програмаЛ
MLA 2147483647 2147483647
4611686014132420609
END
Press any key to continue . . .
Понеже judge ми дава 100 точки, можеш да използваш моят output за ориентир - при големи числа type double променя формата на отпечатване, по-добре работи с long.
Аз си мисля , че пробвах и с long и ми даде грешка . Сега го промених навсякъде с long и тръгна без проблем . Всъщност теста е само 1 и май наистина дават MLA int*int и отговора не се събира в int . Благодаря много !