Loading...
remote87 avatar remote87 121 Точки

[Homework] Math For Developers: Problem 3 Some Factorials

И пак аз! :)

Относно факториелите, имам следния код:

static void Main()
        
        {
            ulong i, number, fact;
            Console.WriteLine("Enter a number to find the factorials");
            number = ulong.Parse(Console.ReadLine());
            fact = number;
            for (i = number - 1; i >= 1; i-- )
            {
                fact = fact * i;
                Console.WriteLine("Factorial of the given number is: {0}", fact);
            }
        }

Правилно ли съм избрал променливата да е ulong, т.к. от лекцията видях, че факториела е продукта от положителните множители?

Не ми става ясно, защо в един момент изписва само 0, препълва се променливата и връща началната стойност на ulong ли? Ако да, защо го изписва доста пъти преди да спре?

 Вярно ли е според вас така да се реши задачата и Е ли е вариант да се сложи брояч на символите от стринга и когато стигне 1 / ulong = 0 / да спира и да не го печата?

 

Май доста избързвам с писането на код? 

Тагове:
0
Programming Basics
mbencheva avatar mbencheva 52 Точки

Привет, 

Значи първото, което е , че според мен няма нужда i, number да са ulong, int им е достатъчно.


Относно 0-лата, ако разгледаш какво се пише по конзолата, то одавна преди нулата се е препълноло. Макс-а за ulong e "18,446,744,073,709,551,615"

Ще дам по-прост пример: например макс-а +1 = 0, t.e. 18,446,744,073,709,551,615 + 1 = 0; 18,446,744,073,709,551,615+2 = 1, надявам се ме разбра:-)

Твоят случай е същият: като пуснеш някакво по-голямо число на конзолата и в момента, в който превърти макс-а за ulong получаваш по-малки числа от макс-а(погледни на конзолата).

В един момент става 0 защото стига до "9223372036854775808", което е точно половината на макс-а на улонг и при първото умножение с нечетно число дава 0, а 0 * квото и да е връща 0. И така си извърта цялия цикъл. Няма никакво осование да спира когато е станало 0.

Просто не можеш да смяташ факториел на големи числа по този начин.(не че не можеш, но не разчитай на верен отговор:-)

 

Ама, че обяснения написах, но се надявам, че ме разбра.

2
10/08/2015 20:03:51
Filkolev avatar Filkolev 4482 Точки

Първо, изкарай принтирането на резултата извън цикъла, за да не ти се принтира на всяка стъпка от пресмятането.

За факториели се ползва BigInteger, другите типове се препълват много бързо, за ulong някъде около 30 беше ако не се лъжа, може и по-малко.

2
remote87 avatar remote87 121 Точки

Добре де, добавих си System.Numerics, използвах BigInteger и пак ми печата 0 ?! :(

class SomeFactorials
    {
        static void Main()
        
        {           
            int i, number, fact;
            Console.WriteLine("Enter a number to find the factorials");
            number = int.Parse(Console.ReadLine());
            fact = number;
            for (i = number - 1; i >= 1; i-- )
            {
                fact = fact * i;               
            }
            BigInteger bigFact = fact;
            Console.WriteLine("Factorial of the given number is: {0}", bigFact);
        }
    }
}

Какво бъркам сега?!

0
DobrinYanev avatar DobrinYanev 1 Точки

Здравей,

Проблемът е, че използваш BigInteger много късно. Трябва да декларираш fact като BigInteger в самото начало. В противен случай, като въртиш цикъла fact се препълва много бързо.

Накрая махаш това bigFact и изписваш на конзолата директно fact.

Поздрави!

1
remote87 avatar remote87 121 Точки

Това си е чисто недоглеждане моето... :(

Извинявай Dobrin и ти благодаря за отзивчивостта...то е пред очите ми, ама трябва някой да гледа. Коригирах го и всичко си работи, както трябва!

Още веднъж благодаря!

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