Esercizio 20

Stato
Discussione chiusa ad ulteriori risposte.

imported_z3r0

Utente Silver
24 Novembre 2008
1
0
0
56
n! means n Ã (n − 1) Ã ... Ã 3 Ã 2 Ã 1

Find the sum of the digits in the number 100!


Molto rudimentale il mio modo di risolverlo.Si poteva fare con un bel ciclo for,ma non avevo voglia

Python
Codice:
asd=100
n=asd-1
i=0
number=0

while(n>1):
	asd=asd*n
	n=n-1

test=str(asd)

gay=int(test[i])

while(i<len(test)):
	gay=int(test[i])
	number= number+gay
	i=i+1

print "sum = ", + number
 
lol, ma siete sicuri che funzioni? anche perkè fattoriale di 100 è un numero molto molto grande, che dubito fortemente ci stia in un int o perfino in un float :omfg:
 
1. Perché non lo testi?
2. Dove vedi scritto int oltre che per trasformare un singolo carattere in un intero?

Quindi sei pregato di non parlare a casaccio nell'ignoranza :D
 
allora, il numero è sicuramente molto grande, le normali calcolatrici scientifiche arrivano a fare al massimo 69!, che è un numero con ordine di grandezza pari a 10^98
Ovviamente nn sta in normali int o float, tuttavia si può o usare la libreria apposita di blacklight, oppure usare linguaggi di scripting che seppur + lenti in genre non hanno grandi limitazioni numeriche.
 
ah, ok, nn l'avevo guardato il tuo codice, che alla fine credo sia praticamente identico a quello che ho usato io.
 
scusate, non avevo letto attentamente, e non avevo notato che fosse py e sovrappensiero pensavo al C..
sorry!
comunque, giusto per arricchire l'argomento:

grazie all'approssimazione di Stirling possiamo trovare l'ordine di grandezza del fattoriale:
per esempio per n = 1000
log10 (1000!) ~= log10 (1000^1000 * e^-1000 * ((2000*pigreco)^(1/2))=
= 1000 log10 (1000) - 1000 log10 (e) + (1/2)log10 ( 2000*pigreco) =
= ~= 2571,9

l'ordine di grandezza di 1000! è circa di 10^2572

mentre per n = 100
log10 (100!) ~= log10 (100^100 * e^-100 * ((200*pigreco)^(1/2))=
= 100 log10 (100) - 100 log10 (e) + (1/2)log10 ( 200*pigreco) =
= 200 - 43.429419 + 1.39909 ~= 155.1714

e l'ordine di grandezza è quindi di circa 10^155

ovviamente questa approssimazione ha un margine di errore visibile ma in certi casi tollerabile, soprattutto per i grandi numeri..

spero di essermi un po fatto perdonare!!
 
ok fallo e vediamo se è tanto spiritoso farlo in C senza librerie adatte, sinceramente io non ci provo neanche, sono contro la matematica asd
(tra l'altro xmario hai sparato cazzate prima il numero sarà di 156 cifre)
(in C float e double perderanno dei valori, e questo non gioca a tuo vantaggio, dovresti farti una cosa tu, ma molto foga però)
EDIT: mi sono messo e l'ho fatto
C:
http://sprunge.us/QGjd?c
uso il metodo di moltiplicazione con riporto, come quello delle elementari xD
un array di int e si risolve tutto, modificando qualche cosina lo si potrebbe far diventare universale...ci penserò su
 
ShuraBozz ha detto:
ok fallo e vediamo se è tanto spiritoso farlo in C senza librerie adatte, sinceramente io non ci provo neanche, sono contro la matematica asd

io non ero affatto spiritoso, piuttosto uno che dice che è contro la matematica non so quanto ne sappia realmente di computer.. e poi, aver la pappa pronta delle librerie, perdi tutto quello che è lo spirito dell'imparare spinto dalla curiosità.. è come limitarsi a guidare la macchina senza saper come è fatto un motore..

(tra l'altro xmario hai sparato cazzate prima il numero sarà di 156 cifre)

io non ho sparato cazzate, quella è matematica, fatta da matematici.. e se tu avessi letto bene, ho scritto che è appunto una approssimazione.. fatta per grandi numeri, dove l'errore diventa trascurabile.. riesci a fare (n!)! con n = 10^500 ?
 
xmario io non ho detto che eri tu spiritoso, ho detto che non è mica facile farlo senza librerie e proprio per il gusto di imparare ho fatto questo programma in C che tu non hai ancora fatto :)
Quando potrò vederlo?
http://sprunge.us/IjjY <-- ecco un benchmark degli esercizi :)
 
LoL, lo vedrete quando il tempo sarà meno tiranno.. adesso son un po impelagato con tanti progetti, di cui alcuni posterò mi sa qualcosa.. che magari posson esser utili alla comunità. cmq si, principalmente pensavo di usare gli array come serie di cifre, però pensavo di usare array di char, più leggeri.. oppure si potrebbe prender la strada dei bit e utilizzare un file come memoria su cui calcolare numeri grandi arbitrariamente in binario.. i metodi sono molti, basta un po di fantasia!


cmq mi son accorto di esser già a cinque di reputazione, ma dai commenti non ho ben capito il perché :omfg:

XD

ps. a breve posterò il programma
 
ShuraBozz ha detto:
no, DEVI farlo tu in php, vediamo come fai asd

ok mo lo faccio =8

cacca.... perde valori... damn
PHP:
<?php

  $num = '0';

  function fattoriale ($n)
  {
    global $num;
    $nu = $n;
    for($i=0;$i<$n;$i++){
      $num+=$nu;
      --$nu;
    }
    return $num;
  }

  echo fattoriale ('100');
?>


MMMM pazzo
 
Stato
Discussione chiusa ad ulteriori risposte.