Loading...
AntoniaGoleva avatar AntoniaGoleva 1 Точки

Factorial Trailing Zeros - въпрос към домашната работа.

Здравейте,

Имам въпрос към следната задача: Write a program that reads the integer number N and prints how many trailing zeros are present at the end of the number N! (N factorial). 

Порових се в нета и видях, че може да се реши със следния for - цикъл:

for (int i = 5; n / i >= 1; i *= 5)

Не мога да си обясня защо условието е n / i >= 1. Може ли някой да ми даде малко разяснения?

Това е целият код:

https://pastebin.com/H5aNNfX7

Тагове:
0
C++ Fundamentals
Dimitar_Petkov_Petkov avatar Dimitar_Petkov_Petkov 169 Точки
Best Answer

Здравей,

тази задача се свежда до намирането на броя множители "10" , те пък от своя страна се представят като 5 x 2.  Тъй като множителите "5" са много - по малко (като бройка) от "2" - ките, търсим "5"-ците.

В показания от теб варинат, числото от което искаме да намерим нулите във факториела, започва да се дели (целочислено, т.е ако има остатък просто го "озхвърляме " и продължаваме делението само с целочислената част) на степените на "5" . И докато (ако приемем входното число да ни е N) N / 5^ е >= 1, тоест в N има поне едно число равно на съответната степен на 5.

пример:

1000 / 5 = 200;

1000 / (5 * 5) = 40;

1000 / (5 * 5 * 5) = 8

1000 / (5 * 5 * 5 * 5) = 1.6 (взимаме само "1" )

1000 / (5 * 5 * 5 * 5 * 5) = 0.32 (< 1 - спираме цикъла)

и сумата = 200 + 40 + 8 + 1 = 249 (нули има във фактурел от 1000)

1
AntoniaGoleva avatar AntoniaGoleva 1 Точки

Благодаря за отговора!

1
Dimitar_Petkov_Petkov avatar Dimitar_Petkov_Petkov 169 Точки

Моля, успех с усвояването C++. Много "бърз" и понякога коварен език .

0
kolioi avatar kolioi 641 Точки

Функцията find_trailing_zeros() ти изчислява степента на 5 в разлагането на n на прости множители. Което е нужно за да се изчисли колко нули има n! както вече е написал колегата. Преди време бях писал един коментар по този въпрос, ето тук. Повече информация има в тази статия. Там също така пише как тази стойност може да се изчисли рекурсивно, без да се използва цикъл

int getFactor5(int number)
{
	if (number < 5)
		return 0;

	number /= 5;
	return number + getFactor5(number);
}

Целочисленото деление, което се използва, всъщност прилага така наречената floor function (\lfloor a\rfloor ). А повече за закръгляването в С++ и различните функции има в този пример.

1
AntoniaGoleva avatar AntoniaGoleva 1 Точки

Благодаря за отговора!

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