Что нового

Все Первая цифра числа

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Хм не знал что на длинну числового значения есть ограничение :(
Пришлось умножать столбиком)
Код:
$val=100

_fac($val)

Func _fac($val)
	Local $ret=1
	For $i=1 to $val
		$ret=ymnozh($ret,$i)
	Next
	ConsoleWrite("Число: "&$val&@CRLF)
	ConsoleWrite("Факториал: "&$ret&@CRLF)
	ConsoleWrite("Первое число: "&StringLeft( $ret,1)&@CRLF)
EndFunc

Func ymnozh($a,$b)

 $a_arry=StringSplit ( $a, "")
 Local $arry[$a_arry[0]+5]
 for $i=1 to $a_arry[0]
	 $arry[$a_arry[0]-$i]=$a_arry[$i]*$b
 Next

 for $i=0 to UBound($arry)-2
	 If $arry[$i]>9 Then
		 $t=$arry[$i]
	 $arry[$i]=StringRight($t,1 )
	 $arry[$i+1]+=Floor ($t/10)
	 EndIf
 Next
 $ret=""
 for $i=0 to UBound($arry)-1
	 $ret=$arry[$i]&$ret
 Next
 Return $ret
EndFunc

для работы скрипта нелльзя искать фаториал числа меньше 2 :smile:


Добавлено:
Сообщение автоматически объединено:

первоя цифра фаториала 5001 получилась 2
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
winstan
медленно. в BigNum как раз столбиком и производят все операции, только в двоичном виде
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Kaster [?]
медленно. в BigNum как раз столбиком и производят все операции, только в двоичном виде
за то работает на любое число до 10000 и то это ограничение из-за разности размеров нового и уже существовавшего массива
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
winstan
я понял что работает, тут рабочих несколько вариантов, если посмотришь. нужен наибыстрейший вариант. а это с логарифмами, который работает хоть до тыщамильонов. ты тему читал? :smile:
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
AZJIO,
я ещё со школы помню задачку: сколькими нулями заканчивается произведение всех чисел от 1 до 100 ? :scratch:
Так что не вижу никакой проблемы в том чтобы обрезать младшие нули.

С другой стороны: при умножении числа на 5000, цифры до какого разряда способны оказать влияние на формирование первой цифры? Я решил что 5 цифр вполне достаточно: 10000000/1000 ;D
Повторюсь, особо не усердствовал. :beer:
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Kaster
Читал, просто так увлёкся созданием своей функции умнжения числа любой длинны на число до 10000, что просто очень хотелось её показать ;D
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Kaster [?]
Ладно, т.к. я ответ уже дал, будем считать победивших нет
Раз победивших нет, напишу-ка я, что мне рассказал великий гугл.

http://www.luschny.de/math/factorial/fffcalc.html
http://www.luschny.de/math/factorial/FastFactorialFunctions.htm

Код:
#cs source
http://www.luschny.de/math/factorial/csharp/ScriptFactorial.html
#ce

Global Const $PI = 3.1415927
Global Const $Log2PI = Log(2*$PI)
Global Const $2Log10 = 2 * Log(10)

ConsoleWrite(FactorialFirstDigit(5001) & @LF)

Func FactorialFirstDigit($iNumber)
	If Not IsInt($iNumber) Or $iNumber < 0 Then Return SetError(1)
	If $iNumber = 0 Or $iNumber = 1 Then Return 1

	$iNumber = 2*$iNumber+1
	$iNumber = ($Log2PI + Log($iNumber/2)*$iNumber - $iNumber - (1 - 7/(30*$iNumber^2)) / (6*$iNumber)) / $2Log10
	$iNumber = 10^($iNumber - Floor($iNumber))

	Return Int($iNumber)
EndFunc


:stars:
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
dwerf [?]
Раз победивших нет, напишу-ка я, что мне рассказал великий гугл.
зачтено :smile: какая-то уж больно хитрая аппроксимация факториального логарифма, но ответ выдает правильный.
 
Сообщения
142
Репутация
-3
Код:
n!
 
Принято, что 0!=1   
1!=1 
2!=2⋅1=2 
3!=3⋅2⋅1=6 
4!=4⋅3⋅2⋅1=24 
5!=5⋅4⋅3⋅2⋅1=120 
6!=6⋅5⋅4⋅3⋅2⋅1=720
Какое число должно быть больше 100? n или факториал?

Код:
$iFac = 80

$iResult = 1
For $i = 1 To $iFac
   $iResultA = 1
   For $j = 1 To $i
	  $iResultA = $j * $iResultA
   Next
   $iResult = Round($iResultA / (10 ^ (StringLen($iResultA) - 1)), Round($i/8))
   If $iResultA > 100 Then
	  ConsoleWrite($i & '   ' & '   ' & $iResultA & '   ' & StringLeft($iResult, 1) & '   ' & @CRLF)
   EndIf
Next

Если я правильно понял.
Код:
5      120   1   
6      720   7   
7      5040   5   
8      40320   4   
9      362880   3   
10      3628800   3   
11      39916800   4   
12      479001600   4   
13      6227020800   6   
14      87178291200   8   
15      1307674368000   1   
16      20922789888000   2   
17      355687428096000   3   
18      6402373705728000   6   
19      121645100408832000   1   
20      2432902008176640000   2   
23      8128291617894825984   8   
25      7034535277573963776   7   
31      4999213071378415616   4   
33      3400198294675128320   3   
34      4926277576697053184   4   
35      6399018521010896896   6   
36      9003737871877668864   9   
37      1096907932701818880   1   
38      4789013295250014208   4   
39      2304077777655037952   2   
42      7538058755741581312   7   
44      2673996885588443136   2   
46      1150331055211806720   1   
49      8789267254022766592   8   
55      6711489344688881664   6   
56      6908521828386340864   6   
57      6404118670120845312   6   
58      2504001392817995776   2   
59      162129586585337856   1   
61      3098476543630901248   3   
62      7638104968020361216   7   
63      1585267068834414592   1   
>Exit code: 0    Time: 0.6316
После 63 не считает. :-\
 
Верх