[C# Fundamentals] Exam(26 April 2016 Evening) - 1. MutantSquirrels


0
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _1.MutantSquirrels { class Program { static void Main(string[] args) { uint trees = uint.Parse(Console.ReadLine()); uint branches = uint.Parse(Console.ReadLine()); uint squirrels = uint.Parse(Console.ReadLine()); uint tails = uint.Parse(Console.ReadLine()); ulong result = trees * branches * squirrels * tails; ulong evenResult = result * 376439; decimal oddResult = (decimal)result / 7.0m; if (result % 2 == 0) { Console.WriteLine("{0:0.000}", evenResult); } else { Console.WriteLine("{0:0.000}", oddResult); } } } }

Някой има ли идея защо този код ми изкарва 20/100 в BGCODER ?
Ето и линк към условието: Цък

Пробвах и с double вместо decimal, естестветно - резултатът е същият.




Отговори



3

И първите променливи трябва да са ти ulong, не uint, защото иначе при умножението се получава overflow. Също така си направи резултатите да са double. Decimal се ползва за числа, при които се изисква по-голяма точност. 
С този код би трябвало да ти даде 100/100: 

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _1.MutantSquirrels { class Program { static void Main(string[] args) { ulong trees = ulong.Parse(Console.ReadLine()); ulong branches = ulong.Parse(Console.ReadLine()); ulong squirrels = ulong.Parse(Console.ReadLine()); ulong tails = ulong.Parse(Console.ReadLine()); ulong result = trees * branches * squirrels * tails; double evenResult = result * 376439d; double oddResult = result / 7d; if (result % 2 == 0) { Console.WriteLine("{0:0.000}", evenResult); } else { Console.WriteLine("{0:0.000}", oddResult); } } } }


от ogitaki (130 точки)


0

Не съм съгласен за първите променливи, нито за overflow-a.
Ето Constraints за първите променливи:

Constraints

  • T will be a positive integer between 1 and 100000 inclusive.
  • B will be a positive integer between 3 and 5000 inclusive.
  • S will be a positive integer between 5 and 800 inclusive
  • N will be a positive integer between 1 and 100 inclusive.

На първо място това означава, че първите променливи могат да ми се поберат дори в по-малки типове данни от uint - съответно първата си е uint, втората и третата ushort, четвъртата byte.

На второ място означава, че максималната възможна стойност за result би ни била = 100,000 * 5,000 * 800 * 100 * 376439(Magic Number) =            15,057,560,000,000,000,000.
ulong типа данни побира 264- 1 =  18,446,744,073,709,551,615.

Така че що се отнася до overflow - не е това. 

Decimal и double вярвам силно, че вадят един и същ резултат до 3-тия знак след запетаята.

Трябва да има по-логично обяснение - предполагам ненапълно точни тестове.


от Arnaudov_St (394 точки)

0

Тази задача е много готина, с удоволствие я реших.

Ето и моето утра-мега-хипер-яко решение катерички :)




0
Тук можеш да видиш авторското решение и тестовете на задачата от БГ Кодер :) .

от mmalamov (57 точки)