Loading...
IlianStefanov2003 avatar IlianStefanov2003 -7 Точки

Проблем с 12 задача

Здравейте,

Имам проблем с ето тази задачка

Не знам как да яреша- трябва да я реша с цикъл он без масив. Стигам од деленето на едното число на другото нео не знам как ад ес закръгли до броят на знакът който си определил в програмата по-горе

Ето го и условието на задачата: /ЧАСТНО/ Дадени са A, B, N (B?0, 1<=N<=1000). Да се намери частното A / B и да се отпечата на екрана, закръглено с N цифри след десетичната запетая. 
Изход (примерен): 
Частното на числата 22 и 7 с 10 цифри след запетаята е 
22/7 = 3,1428571428 

 

Очаквам помощ и може малко обяснения- все забравям и не смъ научил как се закръгляше до определен знак де.

 

http://prntscr.com/jw575c 

скрийншот от задачата

при този код ми изписва грешка: http://prntscr.com/jw57ij там където съм маркирал не съм сигурен дали трябва да етака

И когато стартирам програмата и напиша 22/7 и да закръгли до трети знак ими изписва това:  http://prntscr.com/jw57ri

 

Какво трябва да оправя?

 

Тагове:
-2
Programming Basics
IlianStefanov2003 avatar IlianStefanov2003 -7 Точки

Никой ли не може да помогне?? важно ми е -моля помогнете-за оценка е 

0
willystyle avatar willystyle 2472 Точки

Хм, интересна задача, N (1000 знака) е доста голямо за стандартните типове данни. Предлагам ти да работиш с BigInteger, умножаваш първо А по 10 на степен N, делиш целочислено на Б, и после взимаш послените N цифри за дробна част, предните за цялата.

0
IlianStefanov2003 avatar IlianStefanov2003 -7 Точки

и задачата е такава-питай учителката ми защо е измислила да може да се закръгли до толкова голямо-пратете кода че трябва до днес на обяд да съм готов с нея-

аз мога да пратя кода тук за да видите и да кажете какво да редактирам-хайде така ще го направя

пращам ив кода а вие напишете какво да редактирам-окей?

using System;


public class Program
{
    public static void Main(string[] args)
    {
        int n = int.Parse(Console.ReadLine());
        for (int i = 0; i < n; i++)
        {
            double a = double.Parse(Console.ReadLine());
            double b = double.Parse(Console.ReadLine());
            double result = Math.Round((a / b),n);
            Console.WriteLine(result);
        }
        
    }
}

0
willystyle avatar willystyle 2472 Точки

Нещо с тоя цикъл ме съмняваш, шегаджия ли си, или наистина не разбираш задачата :)

Грешката  понеже прецизността на double e до 15 знака, не може да се закръгля до повече от 15. Така, че засега предавай 1.5% от задачата, т.е до N<15

Освен това учителката ти използва непознато закръгляне, не е нито MidpointRounding.AwayFromZero , нито MidpointRounding.ToEven, за да получиш искания то нея резултат ползвай Math.Truncate:

class problemRounding
{
    static void Main()
    {
        double a = double.Parse(Console.ReadLine());
        double b = double.Parse(Console.ReadLine());
        int n = int.Parse(Console.ReadLine());
        //double result = Math.Round((a / b), n);
        double result = Math.Truncate((a / b) * Math.Pow(10, n)) / Math.Pow(10, n);
        Console.WriteLine(result);
    }
}

 

0
kolioi avatar kolioi 641 Точки

Миналата седмица ти дадох алгоритъм и примерен работещ код, не знам какво още искаш.

С Math.Round няма да стане по няколко причини. Първо, Math.Round закръглява и последната цифра не винаги е вярна - например 2/3=0.66666... а Math.Round дава 0.66...67. Втория проблем е, че записваш частното a/b в число с плаваща запетая (float, double, decimal) където има ограничена точност и затова програмата ти изпушва и хвърля ексепшън - decimal има най-много 28 цифри след десетичната точка. И накрая, числата с плаваща запетая не съхраняват точните стойности, например 0.1 се предтавя като 0.1000000000000000056 и отново се губи точност.

0
IlianStefanov2003 avatar IlianStefanov2003 -7 Точки

ами вчера представих кода на госпожата и каза че не я приема защото трябва да има цикъл задачата а ми дадоха решение където нямаше и сега не знам какво да правя. тя ми вика и "3" е оценка-баси.

0
qwertyto avatar qwertyto 15 Точки

Положи малко усилия, това направи. Дали са ти предостатъчно решения, ако седнеш и помислиш върху тях щеше да имаш какво да предадеш на госпожата.

0
IlianStefanov2003 avatar IlianStefanov2003 -7 Точки

Положих усилия и разбрах задачката. Благодаря на всички. които ми помогнахте и ме съветвахте <3!

0
willystyle avatar willystyle 2472 Точки

Ето ти и по-пълно решение на задачата за големи N (до 1000):

using System;
using System.Text;
using System.Numerics;

class problemRounding
{
    static void Main()
    {       
        BigInteger a = BigInteger.Parse(Console.ReadLine());
        BigInteger b = BigInteger.Parse(Console.ReadLine());
        int n = int.Parse(Console.ReadLine());        
        BigInteger result = new BigInteger();
        result = BigInteger.Divide(BigInteger.Multiply(a, BigInteger.Pow(10, n)), b);       
        string finalResult = result.ToString();
        finalResult = finalResult.Insert((finalResult.Length - n), ".");
        Console.WriteLine(finalResult);
    }
}

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