Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
WF-1000X M6 è la sesta generazione di auricolare in-ear sviluppata da Sony, un prodotto che punta a coniugare facilità di utilizzo con una elevata qualità di riproduzione dei contenuti audio e una cura nella riduzione del rumore ambientale che sia da riferimento
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-10-2005, 20: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, 20: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, 21:36   #3
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16213
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, 21:43   #4
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16213
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, 22: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, 22: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, 15: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 15:16.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 18-10-2005, 17: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, 19: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, 20:39   #10
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16213
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, 06: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, 16: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


Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
NIO stabilisce il nuovo record di scambi...
Dell Private Cloud sempre più ape...
Ennesimo incidente per la guida autonoma...
Dopo le maniglie, è il turno dei ...
Addio incendi incontrollati? Svolt dice ...
WINDTRE si mette in proprio: vender&agra...
The Mandalorian & Grogu: il trailer ...
OpenClaw sotto attacco: i malware infost...
Resident Evil Requiem: pre-load dal 25 f...
Vaticano, la Messa si traduce in 60 ling...
Kia prepara il facelift della Kia EV5: n...
La nuova Alpine A110 elettrica sfrutterà...
Il nuovo entry level della gamma MacBook...
Panasonic 55'' QLED con Dolby Vision e F...
TOP 250 PLUS e TOP 300 PLUS ritornano: v...
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: 17:04.


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