Segui il video qui sotto per vedere come installare il nostro sito come web app sulla tua schermata principale.
Nota: Questa funzionalità potrebbe non essere disponibile in alcuni browser.
Pubblicità
impossibile, ci deve essere qualcosa che rallenta l'esecuzionejava è quasi 5 volte più veloce
In C stai usando exponent come int64_t, in java come int ... nella funzione isArmstrongPrima no, ora si. Ma comunque Java vince per un decimo di secondo
Come mai?@M1n021 ci avrei scommesso, davo per scontato non lavorassi come programmatore...![]()
#include <stdio.h>
#include <inttypes.h>
#define K 18 //MAX 18
int combinazione_R_successiva(unsigned int *u, const unsigned int n, const unsigned int k)
{
for(unsigned int i = k - 1; i < k; --i)
{
if(u[i] < n - 1)
{
if(++u[i] != n - 1)
{
for(unsigned int j = i + 1; j < k; u[j++] = u[i]);
}
return 1;
}
}
return 0;
}
int is_armstrong(unsigned int *u, uint64_t *v, const unsigned int k, uint64_t *sum)
{
unsigned int w[10] = {0};
unsigned int i;
for(i = 0; i < k; *sum += v[u[i]], ++w[u[i++]]);
if(*sum >= v[11] && *sum < v[10])
{
for(uint64_t temp = *sum; w[temp % 10]--; temp /= 10, --i);
}
return !i;
}
int main()
{
uint64_t v[12] = {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
for(unsigned int cont = 0, k = 1; k <= K; ++k)
{
if(k != 1)
{
v[11] = v[10];
}
for(uint64_t i = 2; i < 11; v[i] *= i, ++i);
unsigned int u[K] = {0};
do
{
uint64_t sum = 0;
if(is_armstrong(u, v, k, &sum))
{
printf(" %2u: %"PRIu64"\n", ++cont, sum);
}
}
while(combinazione_R_successiva(u, 10, k));
}
return 0;
}
for(uint64_t temp = *sum; w[temp % 10]--; temp /= 10, --i);
for(lldiv_t d = {*sum}; w[(d = lldiv(d.quot, 10)).rem]--; --i);
Sistemato, C guadagna due decimi di secondo che lo fanno vincere.In C stai usando exponent come int64_t, in java come int ... nella funzione isArmstrong
-O2, -O3 (etc.) sono i vari livelli di ottimizzazione del codice prodotto dal compilatore gcc, di seguito li hai tutti:Sistemato, C guadagna due decimi di secondo che lo fanno vincere.
Ma comunque, cosa serve effettivamente il flag -O3?
Perche' con meno ottimizzazioni il tempo di compilazione si riduce (pensa a progetti piu' grandi)... quando hai definitivamente "sistemato" il codice, rilasci la tua release, con il livello di ottimizzazione desiderato.Ma perché gcc non compila direttamente in O3? Che senso ha non usare il livello pi§ alto di ottimizzazione
comunque, anche per colpa nostra (mia prima di tutto) stai perdendo d'occhio il vero obiettivo, che è imparare a programmare bene (si spera);Sistemato, C guadagna due decimi di secondo che lo fanno vincere.
Ma comunque, cosa serve effettivamente il flag -O3?
perchè il codice che hai scritto è poco modulareCome mai?
Io però non ho la minima idea di come fare un crivello del genere. E mi stupisco anche di essere riuscito a mettere insieme nu programma simile (in C), ovviamente con i dovuti aggiustamenti da parte vostracomunque, anche per colpa nostra (mia prima di tutto) stai perdendo d'occhio il vero obiettivo, che è imparare a programmare bene (si spera);
non focalizzarti sulle prestazioni, è sbagliato, focalizzati sull'algoritmo;
la funzione isArmstrong() deve restituire vero/falso, se lo fa velcocemente tanto meglio; una funzione che risponde si/no raramente è adatta per generare numeri di un certo tipo, si usano i crivelli come ha fatto il nostro amico @M1n021
ti faccio un altro esempio: se programmi una funzione che testa se un numero è primo, non è conveniente usarla per generre intervalli di numeri primi
Ah, ha sensoPerche' con meno ottimizzazioni il tempo di compilazione si riduce (pensa a progetti piu' grandi)... quando hai definitivamente "sistemato" il codice, rilasci la tua release, con il livello di ottimizzazione desiderato.
Ed anche se devi fare debug... non e' indicata l'ottimizzazione
E puoi anche decidere di ottimizzare per "size" (dimensione eseguibile) per esempio
non ce l'hai ancora perché l'Informatica, guarda caso, è la scienza che studia gli algoritmi: sono cose che si studiano piano piano. Ma un crivello per i numeri primi puoi già programmarlo anche tu, si chiama Crivello di Eratostene e puoi farlo perfino a mano per piccoli intervalli di numeri ovviamenteIo però non ho la minima idea di come fare un crivello del genere
Mi ricordo quando lo facevo alle elementari. Lo faccio in C o in python?non ce l'hai ancora perché l'Informatica, guarda caso, è la scienza che studia gli algoritmi: sono cose che si studiano piano piano. Ma un crivello per i numeri primi puoi già programmarlo anche tu, si chiama Crivello di Eratostene e puoi farlo perfino a mano per piccoli intervalli di numeri ovviamente
fai una tabella come quella delle tabelline e ci scrivi i numeri da 1 a 100
dato che 2 è il primo numero primo, cancelli il numero uno e tutti i numeri pari eccetto il 2 (al 2 fai un cerchietto)
il primo numero NON cancellato dopo il 2 è il numero 3: gli fai un cerchietto e poi cancellli tutti i numeri multipli di 3 (6, 9, 12...)
il successivo numero non cancellato è il 5, gli fai un cerchietto e poi cancelli i multipli di 5 (10,15,20...)
e continui così fino a quando arrivi alla fine della tabella con solo cerchietti (i numeri primi) o numeri cancellati (che non sono primi)
fallo a mono per bene e troverai la sequenza 2,3,5,7,11,13,17.... tutti i numeri primi minori di 100
poi lo fai al computer: ti basta un array di 100 posizioniprovaci, vedrai che ti diverti
come vuoiMi ricordo quando lo facevo alle elementari. Lo faccio in C o in python?
Se stai imparando C, usa quello. Ma come dice BAT, come vuoi. Se ti trovi meglio in Python, usa quello, e dopo lo scrivi in C.Mi ricordo quando lo facevo alle elementari. Lo faccio in C o in python?
Domani leggo bene tutto il post, sono da smartphone.Come mai?![]()
Sistemato, C guadagna due decimi di secondo che lo fanno vincere.
Ma comunque, cosa serve effettivamente il flag -O3?
-O2, -O3 (etc.) sono i vari livelli di ottimizzazione del codice prodotto dal compilatore gcc, di seguito li hai tutti:
Optimize Options (Using the GNU Compiler Collection (GCC))
Optimize Options (Using the GNU Compiler Collection (GCC))gcc.gnu.org
... per default l'opzione e' -O0
Dipende che insieme di numeri si considera, e come tale insieme viene definito.… piccole modifiche per fare in modo che anche lo zero sia conteggiato come numero di Armstrong (non vedo perché escluderlo):