🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: comp.lang.pascal.misc
Article #46

Re: Tough FACTORIAL math problem...

#46
From: The Crow
Date: Fri, 16 Feb 1996 19:06
66 lines
3492 bytes
In article <4fv74c$chq@gatekeeper.alcatel.no>, Sven.Pran@alcatel.noL says...
>
>In article <31224679.6193@born.com>, John Cleland <clelaj@born.com> wrote:
>>The Crow wrote:
>>> 
>>> Here is what I am trying to do, I want to find the last NON-ZERO digit of a
>>> given factorial.  For instance,
>>> 
>>> 5! = 120
>>> 
>>> so the last non-zero digit is 2.  I want to be able to do this up to 1000.
>>> Problem is, no matter how huge of a data-type you use, there isn't any way 
>>> for the computer to handle 1000!, it is however possible to find the last 
>>> non-zero digit somehow.  One thing I have tried is as I went through 
>>> multiplying the series of numbers in the factorial (5 * 4 * 3 * 2) I would 
>>> remove all the trailing ZEROS, I got this to work up to 789, but it wont 
>>> work with 1000 and i am not really sure why.  If anyone has a clue how I 
>>> can do this let me know.
>>
>>Don't just strip the trailing zeros, remove all digits except the last 
>>non-zero digit (which is your output) and then multiply by the next number in 
>>your sequence. This keeps the numbers down to a managable level and gives the 
>>correct answer as no more significant digit can affect the value of the LSD.
>>
> . . . .
>
>No, it is obviously not sufficient to keep the last single non-zero digit, and 
>the problem appears to be a very interesting and intriguing one:
>
>A new trailing zero is 'created' every time the next multiplier is divisible 
>by 5, and how can we then calculate the next 'rightmost significant' digit?
>
>Example when a multiplier ends in 05:
>
>If the 'previous' factorial ended in 02 then the new factorial will end in 1 
>while if it ended in 12 then the new factorial will end in 6 (after removal of 
>trailing zeroes).
>
>Thus the SINGLE rightmost significant digit in the new factorial depends upon 
>the TWO rightmost significant digits both in the previous factorial and in the 
>multiplier.
>
>This means that we must keep track of the last TWO digits to calculate the new 
>SINGLE rightmost significant digit whenever a zero is 'created'. For similar 
>reasons we must track THREE digits to calculate the new TWO rightmost 
>significant digits - and so on.
>
>How many zeroes have been 'removed' when we reach 1000! ? The answer is 249, 
>which means that in order to maintain the precision needed we must track the 
>last 250 digits less the number of zeroes already 'removed' when N! reaches a 
>number with that many digits.
>
>This is where I get stuck. Hey - number theory specialists: How do we proceed?
>
>regards Sven
I got it working, it is actually fairly easy, first you remove EVERY zero from 
the number, not just trailing ones (converting the number to a string and back 
again makes this easy) next you remove all but the last 3 digits, and walla. it 
works.



-- 
The Crow - thecrow@iconn.net
"It can't rain all the time"
-Kryptology
Technical Details
Message-ID: <4g2kj8$1sg@news.iconn.net>
Path: arc1-ca.pugleaf.net!news.iconn.net!news
References: <4fr8be$ass@news.iconn.net> <31224679.6193@born.com> <4fv74c$chq@gatekeeper.alcatel.no>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!news.iconn.net!news
From: thecrow@iconn.net (The Crow)
Newsgroups: comp.lang.pascal.misc,comp.lang.c++,comp.lang.c,comp.lang.pascal.borland
Subject: Re: Tough FACTORIAL math problem...
Date: 16 Feb 1996 19:06:15 GMT
Organization: I rule the world
Message-ID: <4g2kj8$1sg@news.iconn.net>
References: <4fr8be$ass@news.iconn.net> <31224679.6193@born.com> <4fv74c$chq@gatekeeper.alcatel.no>
NNTP-Posting-Host: st-ts00-01.iconn.net
Mime-Version: 1.0
Content-Type: Text/Plain; charset=US-ASCII
X-Newsreader: WinVN 0.99.6