Loading...
KaloyanNikolov avatar KaloyanNikolov 2 Точки

Въпрос относно задача 01. Charity Marathon от изпита на 23.10.2016

Здравейте! Пиша за втори път цялата тема, защото заби сайта поради някаква причина и 15 минути писане на вятъра... :D 
Ще го напиша по-сбито сега, но общо казано имах проблем с първата задача от изпита. На нея изкарах 70/100 точки и се чудех доста време на какво се дължи. Пробвах по различни начини и така до онзи ден, когато бяхме в лекция и ми прещрака пак да се разровя в кода. Един човек седеше до мен тогава и беше така добър да ми погледне кода, а аз му обясних какъв ми е проблема. Той ми каза къде ми е грешката, а именно в закръглянето до втория знак. На изпита проверих в нета как се закръглява, за да съм сигурен, че го правя правилно, при което реших да пробвам по два начина - единия с Math.Round, а другия - директно при отпечатването. Първия път пробвах с Math.Round и не знам какъв ми е бил резултата, обаче след като опитах на кода си от изпита по този начин ми даде 90 точки, които не ми е дало по време на изпита (сигурно тогава ми е била друга грешката, но както и да е - не в това е въпроса). След това реших директно при изхода да закръглям чрез това, което видях в нета - Console.WriteLine("Money raised: {0:N2}", moneyRaised). Взимайте в предвид само {0:N2}. 
Човека седящ до мен ми обясни, че не се прави с N2, ами с F2. От тук изниква фундаменталния ми въпрос, за който е цялата тема - каква е разликата между закръгляне с N2 и закръгляне с F2 и защо при изпита ми даде 70/100 точки при първото закръгляне, а с второто ми даде 100?
Поздрави.

0
Programming Fundamentals
puffed avatar puffed 289 Точки

 Изглежда, че N слага и разделител за хилядите, докато F не прави такова нещо. Например:

double num2 = 4836731.60217657;
decimal num3 = 2348247.8184261974584555216535342341m;

Console.WriteLine("{0:N2}", num2);
Console.WriteLine("{0:F2}", num3);

/*Изход:
4,836,731.60
2348247.82
*/

0
KaloyanNikolov avatar KaloyanNikolov 2 Точки

Ахааа! Благодаря, особено много ми помогна, тъй като в нета не успях да намеря информация за това.

0
YordanDringov avatar YordanDringov 26 Точки
using System;

class CharityMarathon
{
    static void Main(string[] args)
    {
        int days = int.Parse(Console.ReadLine());
        int runners = int.Parse(Console.ReadLine());
        int laps = int.Parse(Console.ReadLine());
        int lapLenght = int.Parse(Console.ReadLine());
        int trackCapacity = int.Parse(Console.ReadLine());
        double moneyPerKm = double.Parse(Console.ReadLine());

        int maxRunners = 0;
        if(trackCapacity * days >= runners )
        {
            maxRunners = runners;
            long totalKm = ((long)(maxRunners * laps * lapLenght))/1000;
            CalculateTotalMoney(moneyPerKm, totalKm);
        }
        else
        {
            maxRunners = trackCapacity * days;
            long totalKm = ((long)(maxRunners *laps* lapLenght))/1000;
            CalculateTotalMoney(moneyPerKm, totalKm);
        }       
    }

    private static void CalculateTotalMoney(double moneyPerKm, long totalKm)
    {
        double totalMoney = totalKm * moneyPerKm;
        Console.WriteLine("Money raised: {0:F2}", totalMoney);
    }
}

Аз имам малък проблем с тази задача и ще се радвам ако някой успее да ми подскаже къде греша... На тестовете ми дава 80/100, като ми гърмят последните два... което ме кара да си мисля че някъде препълвам но не мога да разбера къде?

 

0
yordank avatar yordank 89 Точки
 long totalKm = ((long)(maxRunners * laps * lapLenght))/1000;

Според мен ,тези редове не правят точно това което трябва да правят при препълване.Във вътрешните скоби има умножение на 3 променливи от тип int,като резултата от умножението ще е пак от тип int( 32-bit ).И вече като има препълване резултата ще е някакво отрицателно(може и положително да е,но пак ще е грешно умножението) число от рода на -312156656 и това отрицателно число се преобразува в long.

Но ако промениш тези редове на

long totalKm = (   (long)maxRunners * laps * lapLenght  ) / 1000;

т.е преобразуваш maxRunners към long,то резултата от умножението вече  трябва да е верен и да е от тип long

 

1
26/12/2016 22:27:55
NonaG avatar NonaG 111 Точки

LapLength трябва да е double.(поне при мен това оправи последните два теста).

1
k_aleksiev avatar k_aleksiev 6 Точки

YordanDringov   Ще получиш 100/100   ако промениш в метода   decimal totalMoney =(decimal)(totalKm * moneyPerKm); и  промениш типа данни   double lapLenght = double.Parse(Console.ReadLine());

1
Ljubo6 avatar Ljubo6 21 Точки

И аз се сблъсках с подобен проблем,но след като спазих условието всички входове да са integer -  провал,тогава се сетих ,че има умножение за totalMeters и най вероятно се прехвърля integer-a , смених входовете на long  и всичко се оправи 100/100

https://pastebin.com/raw/it3tbXFy

0
svetlyoek avatar svetlyoek 20 Точки

Не разбирам къде е споменато да е long и как се подразбира да е?

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