Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Renault 5 elettrica al giudizio definitivo: solo stupore iniziale o premi meritati?
Renault 5 elettrica al giudizio definitivo: solo stupore iniziale o premi meritati?
Dopo più di un anno dal primo test drive ci siamo rimessi al volante della Renault 5 E-Tech Electric, questa volta utilizzandola come prima auto per circa due settimane. Scoprite con noi se il progetto convince ancora
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix
Un proiettore economico, che fa della portabilità e immediatezza i suoi punti di forza. Adatto per una camera da letto o per la casa vacanze, è basato su sistema proprietario Linux ma offre piena compatibilità ufficiale a Netflix
ASUS ProArt GoPro Edition è il notebook compatto per chi crea
ASUS ProArt GoPro Edition è il notebook compatto per chi crea
Un notebook sviluppato in collaborazione con GoPro ma che risponde al meglio alle necessità di tutti coloro che creano contenuti video: robustezza, design, potenza di calcolo e funzionalità si abbinano al meglio tra di loro, pur se a prezzo di un costo elevato per via della tanta memoria onboard
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-10-2005, 19:33   #1
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
[C] Numeri perfetti

Ciao a tutti!!!

Ho un problema da risolvere ed è il seguente:

Scrivere un programma che dato in input un intero n, restituisce tutti i numeri perfetti fino n

Io ho provato a farlo, volevo sapere se andavo bene, perché come metto numeri un pò più grandi per trovare il numero perfetto ci mette un pò di più:

Codice:
#include <stdio.h>

int main(void){
    
    int n,i,j, sum_div;
    
    printf("Inserisci un numero maggiore di 2: ");
    scanf("%d", &n);
    
    for(i=2; i<=n; ++i){
       sum_div=0;
       for(j=2; j<=i; ++j)
          if(i%j==0){
            sum_div+=(i/j);
            continue;
          }
          else continue;
       if(sum_div==i){
         printf("%d ", i);
         continue;
       }
       else continue;
    }
    
    return 0;
}
Grazie!
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2005, 19:57   #2
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Quote:
Originariamente inviato da Manugal
Ciao a tutti!!!

Ho un problema da risolvere ed è il seguente:

Scrivere un programma che dato in input un intero n, restituisce tutti i numeri perfetti fino n

Io ho provato a farlo, volevo sapere se andavo bene, perché come metto numeri un pò più grandi per trovare il numero perfetto ci mette un pò di più:

Codice:
#include <stdio.h>

int main(void){
    
    int n,i,j, sum_div;
    
    printf("Inserisci un numero maggiore di 2: ");
    scanf("%d", &n);
    
    for(i=2; i<=n; ++i){
       sum_div=0;
       for(j=2; j<=i; ++j)
          if(i%j==0){
            sum_div+=(i/j);
            continue;
          }
          else continue;
       if(sum_div==i){
         printf("%d ", i);
         continue;
       }
       else continue;
    }
    
    return 0;
}
Grazie!
Ehm cos'è un numero perfetto?

Io sapevo che era il 3 il numero perfetto, no?
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2005, 20:36   #3
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16214
Quote:
Originariamente inviato da Manugal
come metto numeri un pò più grandi per trovare il numero perfetto ci mette un pò di più
Tieni conto del fatto che, quando verifichi se N è perfetto, devi fare O(N) verifiche di divisibilità... non mi stupisce che su numeri grandini ti ci voglia un bel po' di tempo.
Quote:
Codice:
    for(i=2; i<=n; ++i){
       sum_div=0;
for(j=2; j<=i; ++j)
Nella definizione di numero perfetto, 1 è considerato un divisore.
Perciò, o fai il ciclo su j a partire da j=1, o inizializzi sum_div a 1 a ogni nuova iterazione su i.
Quote:
Codice:
          if(i%j==0){
            sum_div+=(i/j);
            continue;
          }
In realtà puoi aumentare di j, perché se a un'iterazione trovi il divisore j, a un'altra trovi il divisore i/j.
(A meno che non sia i=j^2, ma comunque quello va contato una volta sola.)
Quote:
Codice:
          else continue;
       if(sum_div==i){
         printf("%d ", i);
Tu conti i divisori di i fino a i incluso.
Quindi, quando hai finito, i è perfetto se e solo se sum_div è uguale a 2i.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2005, 20:43   #4
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16214
Quote:
Originariamente inviato da AnonimoVeneziano
cos'è un numero perfetto?
Un numero N>1 si dice perfetto, se è uguale alla somma di tutti i suoi divisori, incluso 1 ed escluso N.
Un numero pari è perfetto se e solo se ha la forma (2^(n-1))((2^n)-1) con (2^n)-1 primo: quindi 6=(2^(2-1))((2^2)-1) è primo, e così anche 28=(2^(3-1))((2^3)-1), ma non 120=(2^(4-1))((2^4)-1).
Non si conoscono numeri perfetti dispari, né si sa se ne esistano. Si sa però che, se esistessero, avrebbero almeno 300 cifre decimali.

Fonte: Wikipedia.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2005, 21:03   #5
repne scasb
Bannato
 
Iscritto dal: Feb 2003
Messaggi: 947
Quote:
Originariamente inviato da Manugal
Io ho provato a farlo, volevo sapere se andavo bene, perché come metto numeri un pò più grandi per trovare il numero perfetto ci mette un pò di più:
Se e' la prestazione che cerchi:

Codice:
#include <stdio.h>

void main(void){
    
    unsigned long i,j,k,l,m,n;
    
    printf("Inserisci un numero maggiore di 2: ");
    scanf("%ld", &n);
    
    for(i=2;(j=(1L<<(i-1))*((1L<<i)-1))<=n;i++)
    {
	for(m=0,l=(1L<<i)-1,k=2;k*k<=j;k+=k==2?1:2)
	{
	    if((l%k)==0)
	    {
		m=1;
		break;
	    }
	}
	if(m==0)
            printf("%ld ",j);
    }
}
NOTA: Potrebbero esserci degli errori l'ho scritta di getto in pochi minuti ed e' scarsamente ottimizzata.
repne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2005, 21:20   #6
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Grazie per la spiegazione Ziosilvio!
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 18-10-2005, 14:08   #7
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Grazie delle risposte, però mi sembra molto strano che un numero N è perfetto se e solo se la somma di tutti i suoi divisori tranne N danno esattamente il numero N. Ad esempio considero il numero 6 (che è il più semplice numero perfetto). Secondo quello che ho pensato io faccio 6/2 (primo divisore) e viene 3 poi 6/3 (secondo divisore) e viene 2 e poi 6/6 (terzo divisore) e viene 1. Sommandoli viene esattamente 6. Se facessi come dite voi, innanzitutto se considero anche 1 come divisore già sono fuori con la somma (ma mettiamo il caso che non lo consideri), se io non considero poi, nel caso di 6, il 6 stesso come divisore, la somma dei divisori mi viene 5 e non 6 quindi non sarebbe più numero perfetto. Spero di essere stato chiaro.

Ultima modifica di Manugal : 18-10-2005 alle 14:16.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 18-10-2005, 16:09   #8
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
up
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 18-10-2005, 18:10   #9
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
quando in un thread interviene Ziosilvio mi sento umiliato...
quando in un thread interviene repne scasb mi sento avvilito...
quanto intervengono entrambi mi viene voglia di suicidarmi...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 18-10-2005, 19:39   #10
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16214
Quote:
Originariamente inviato da Manugal
mi sembra molto strano che un numero N è perfetto se e solo se la somma di tutti i suoi divisori tranne N danno esattamente il numero N. Ad esempio considero il numero 6 (che è il più semplice numero perfetto). Secondo quello che ho pensato io faccio 6/2 (primo divisore) e viene 3 poi 6/3 (secondo divisore) e viene 2 e poi 6/6 (terzo divisore) e viene 1. Sommandoli viene esattamente 6.
Uhm... tu così non stai facendo la somma dei divisori, ma quella dei quozienti.
Infatti, quando j divide i, allora tu incrementi la somma non di j, ma di i/j.

Però --- ed è una cosa che, mea culpa, non avevo notato subito --- i divisori sono in corrispondenza uno-a-uno con i quozienti, e al divisore i corrisponde proprio il quoziente 1.
Inoltre, ci vuole poco a notare che anche i quozienti sono divisori, e i divisori quozienti.

Perciò, ripensandoci... mi sa che il tuo programma iniziale andava già bene.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 19-10-2005, 05:50   #11
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Ah ecco ora ho capito.. Ho fatto confusione tra quoziente e divisore, io infatti calcolo il quoziente e sommo il quoziente. Grazie.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 19-10-2005, 15:55   #12
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Scusate ma ancora non ho capito bene. Nell'ultimo passaggio mi hai detto che io aumento la somma di i/j, ma così sommerei i quozienti non i divisori come dovrei invece fare.. quindi in teoria il mio prog sarebbe errato? O no?
Manugal è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Renault 5 elettrica al giudizio definitivo: solo stupore iniziale o premi meritati? Renault 5 elettrica al giudizio definitivo: solo...
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix HONOR CHOICE Projector Air Pro: piccolo, portati...
ASUS ProArt GoPro Edition è il notebook compatto per chi crea ASUS ProArt GoPro Edition è il notebook c...
Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090 Fable e Sol a confronto: due cartoni animati cre...
Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile Il tablet rugged leggero e sottile: Lenovo Think...
Le marmotte finiscono su OnlyFans, ma il...
Xbox Cloud Gaming si espande e arriva su...
Il riconoscimento facciale con IA per co...
MacBook Ultra: il nuovo design arriver&a...
Gli utenti passano più tempo su Instagra...
L'AI sta facendo guadagnare miliardi anc...
L'Odissea di Nolan rilancia Assassin's C...
Russia vieta il mining di criptovalute a...
Lenovo sta preparando il lancio di un Go...
L'intelligenza artificiale colpisce dove...
Xiaomi, si prepara ad aggiornare la fasc...
Rincari in arrivo per gli iPhone: i nuov...
Le edizioni fisiche dei giochi per PlayS...
Aziende IA comprano migliaia di libri ac...
L'IA frena gli utenti di Reddit: azioni ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 06:32.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v