Torna indietro   Hardware Upgrade Forum > Software > Programmazione

In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi
In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi
Abbiamo assemblato e provato la Fiido Nomads Pro, evoluzione del modello da trekking già presente nella gamma, che migliora in tutto, soprattutto grazie al motore centrale, fluido e potente. Ottima app, costruzione solida e prezzo ok completano il quadro
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto
Lo chassis in Ceraluminium è il cuore di questo notebook in edizione 2026, un modello pensato per garantire produttività con le tipiche applicazioni di produttività personale e capace di offrire un'autonomia di funzionamento lontano dalla presa di corrente da riferimento. Potenza, facilità di trasporto e costruzione robusta tutto in un notebook compatto.
MSI PRO MAX: QD-OLED ultrawide per lavorare, creare e giocare
MSI PRO MAX: QD-OLED ultrawide per lavorare, creare e giocare
MSI PRO MAX 341QPXW14G è un monitor ultrawide da 34 pollici che porta la tecnologia QD-OLED di quinta generazione in un contesto principalmente orientato alla produttività. La qualità dell'immagine è elevatissima, il formato 21:9 è ideale per il multitasking e la dotazione di porte trasforma il monitor in un vero hub per Mac, PC e dispositivi mobili. Il limite principale è invece il refresh rate di soli 144 Hz, che lo allontana dai giocatori competitivi più esigenti
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 18-07-2007, 08:13   #1
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
[C] Crivello di Eratostene

Qualcuno mi sa dire perchè non funziona questo programma? E' stato più facile del previsto farlo, ma non funge

#include <stdio.h>
#define SIZE 20

int main(){

int n;
int a[SIZE];
int i;
int j=2;

for(i=0;i<SIZE;i++){
a[i]=1;}

printf("Inserisci un intero n:\n");
scanf("&d", &n);
for(j=2;j<n;j++){
for(i=2;i<=n;i++){
if((i!=j)&&((i%j)==0)){
a[i]=0;}}}
for(i=0;i<n;i++){
if(a[i]==1){
printf("%d\n", a[i]);}}}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2007, 08:14   #2
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
Il programma deve trovare i numeri primi da 1 a n
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2007, 08:59   #3
pisto
 
Messaggi: n/a
è il primo thread su C a cui rispondo, potrei dir cazzate... ho incominciato a guardarmi il C ieri e sto ancora tribolando ad installare il compilatore quindi non posso testare..

cmq: prima di tutto il tuo programma crea un array di dimensione fissa, quindi evidentemente non può trovare i numeri primi fino ad n ad ogni valore di n. quindi la lunghezza dell'array che crei deve dipendere da n.

poi, nei for che fanno effettivamente il crivello ti complichi la vita, basterebbe moltiplicare j da 2 in poi (controllare che il risultato non sia superiore alla lunghezza dell'array) e mettere 0 nel rispettivo indice dell'array ottenuto da questa operazione. attualmente con il tuo programma rischi di superare il limite dell'array fino al quadrato della sua dimensione!

ci sarebbero altre ottimizzazioni, ma per adesso guarda se con queste correzioni va.
  Rispondi citando il messaggio o parte di esso
Old 18-07-2007, 09:18   #4
mapomapo
Senior Member
 
L'Avatar di mapomapo
 
Iscritto dal: May 2005
Città: Bari
Messaggi: 349
Codice:
#include <stdio.h>
#include <stdlib.h>

void main()
{

	int n;
	int *a;
	int i;
	int j=2;

	printf("Inserisci un intero n: ");
	scanf("%d", &n);

	a = (int *)malloc((n+2)*sizeof(int));

	for(i=0;i<n;i++)
		a[i]=1;

	for(j=2;j<n;j++)
		for(i=2;i<n;i++)
			if( (i != j) && ( (i%j)==0 ) )
				a[i]=0;
	

	for(i=2;i<n;i++)
		if(a[i]==1)
			printf("%d ", i);
        printf("\n");

}
Ho provato a riscriverlo visto che non capivo bene la tua logica, scusami ma sono abituato così
il mio programmino lavora in questa maniera:
-Acquisisce il numero n secondo il criterio di Eratostene
-Alloca un vettore di n+2 elementi (così posso lavorare sull'indice del vettore!)
-Esegue un paio di for annidati e credo in questo caso operi secondo la tua stessa logica.

Vito
__________________
Si può vincere una guerra in due...o forse anche da solo. Si può estrarre il cuore anche al più nero assassino, ma è più difficile cambiare un'idea!
mapomapo è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2007, 09:36   #5
pisto
 
Messaggi: n/a
Quote:
Originariamente inviato da mapomapo Guarda i messaggi
Codice:
for(j=2;j<n;j++)
	for(i=2;i<n;i++)
		if( (i != j) && ( (i%j)==0 ) )
			a[i]=0;
sì in effetti ho detto una cazzata, così funziona perfettamente questa parte, non va oltre il limite dell'array.
però, non sarebbe molto + semplice una cosa tipo:
Codice:
for(j=2;j<=n/2;j++){
  for(i=2;i<=n/j;i++){
    a[i]=0;
  }
}
  Rispondi citando il messaggio o parte di esso
Old 18-07-2007, 09:43   #6
LetBloodline
Junior Member
 
Iscritto dal: Jul 2007
Messaggi: 27
Quote:
Originariamente inviato da pisto Guarda i messaggi
sì in effetti ho detto una cazzata, così funziona perfettamente questa parte, non va oltre il limite dell'array.
però, non sarebbe molto + semplice una cosa tipo:
Codice:
for(j=2;j<=n/2;j++){
  for(i=2;i<=n/j;i++){
    a[i]=0;
  }
}
Ma così metti a 0 tutti gli elementi dell'array da 2 a n/2 Oo

Codice:
for(i=2;i<=n/j;i++){
    a[i]=0;
nella prima interazione j vale 2 e avremo
Codice:
for(i=2;i<=n/2,i++){
    a[i]=0;
Prende tutta la prima metà dell'array e la mette a 0 a partire dall'indice 2, compresi 3 5 7 9 etc
LetBloodline è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2007, 09:59   #7
Furla
Senior Member
 
Iscritto dal: Feb 2004
Messaggi: 1454
il verbo "Indentare" ti dice nulla?
faresti un favore a te e agli altri, se rendessi il tuo codice leggibile:

Codice:
int main()
{
 int n;
 int a[SIZE];
 int i;
 int j=2;

 for(i=0;i<SIZE;i++)
    a[i]=1;

 printf("Inserisci un intero n:\n");
 scanf("%d", &n);

 for(j=2; j<n; j++)
    for(i=2; i<=n; i++)
        if(i!=j && i%j==0)
            a[i]=0;

 for(i=0; i<n; i++)
    if(a[i]==1)
        printf("%d\n", a[i]);
}
prima di tutto le parentesi graffe le puoi togliere, quando il corpo del costrutto prevede una sola istruzione: in quei casi appesantiscono e confondono la lettura.

poi tu usi un array di interi, ma li usi come flag binari. potresti usare il tipo char per ottimizzare lo spazio, o addirittura usare un solo bit per numero giocando con maschere e shift. inoltre usi un array di dimensione fissa senza alcun controllo sul numero inserito: o aggiungi il controllo o allochi dinamicamente l'array per "adeguarlo" a quel numero.

nell'ultimo for controlli che a[i] sia uno, e se è così lo stampi... ovvio che il programma stampi a video una serie di "1"... quello che volevi fare era stampare gli indici i per i quali il flag è rimasto a 1 dopo l'applicazione del crivello.

Ultima modifica di Furla : 18-07-2007 alle 18:08.
Furla è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2007, 13:30   #8
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
Grazie mille per le risposte

Tra un'oretta le comincio a guardare, ora sono impegnato in un altro programmino
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2007, 14:46   #9
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
scusate ma non so proprio come incollarlo bene, come fate voi

comq ho modificato una cosetta ma come risultato mi da 1, non capisco dove sbaglio


#include <stdio.h>
#define SIZE 20

int main(){

int n;
int a[n];
int i;
int j=2;

printf("Inserisci un intero n:\n");
scanf("&d", &n);

for(i=0;i<n;i++){
a[i]=1;}


for(j=2;j<n;j++){
for(i=2;i<=n;i++){
if((i!=j)&&((i%j)==0)){
a[i]=0;}}}
for(i=0;i<n;i++){
if(a[i]==1){
printf("%d\n", a[i]);}} }
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2007, 14:48   #10
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
ho modificato un'altra cosetta e ora mi da 0 e 1 come risultato

#include <stdio.h>
#define SIZE 20

int main(){

int n;
int a[n];
int i;
int j=2;

printf("Inserisci un intero n:\n");
scanf("&d", &n);

for(i=0;i<n;i++){
a[i]=1;}


for(j=2;j<n;j++){
for(i=2;i<=n;i++){
if((i!=j)&&((i%j)==0)){
a[i]=0;}}}
for(i=0;i<n;i++){
if(a[i]==1){
printf("%d\n", i);}}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2007, 14:53   #11
pisto
 
Messaggi: n/a
cribbio, volevo dire:
Codice:
for(j=2;j<=n/2;j++){
  for(i=2;i<=n/j;i++){
    a[j*i]=0;
  }
}
il che è mooolto più veloce dell'iterazione di bubba

edit: facendo dei test in java: col mio metodo fino a 10000000 ci vogliono col mio 13.5 secondi, col suo.... sta ancora girando XD

Ultima modifica di pisto : 18-07-2007 alle 15:08.
  Rispondi citando il messaggio o parte di esso
Old 18-07-2007, 14:56   #12
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
ho provato a mettere il pezzo che dici tu ma mi da sempre 0 e 1, come se il 2,3,5 ecc..non li conta come primi, forse sbaglio quando stampo il risultato

#include <stdio.h>
#define SIZE 20

int main(){

int n;
int a[n];
int i;
int j=2;

printf("Inserisci un intero n:\n");
scanf("&d", &n);

for(i=0;i<n;i++){
a[i]=1;}


for(j=2;j<=n/2;j++){
for(i=2;i<=n/j;i++){
a[j*i]=0;
}
}
for(i=0;i<n;i++){
if(a[i]==1){
printf("%d\n", i);}}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2007, 15:11   #13
pisto
 
Messaggi: n/a
la parte di codice che stampa è corretta, almeno come hai costruito il ciclo for, credo che sia qualcosa che non va in "printf("%d\n", i)", ma non ti so aiutare, io di c sto ancora a dichiarazione e definizione, include etcetera

edit: prova a mettere printf("%d", i)
edit2: segui il consiglio di Furla, cioè di alleggerire l'array...
edit3: aspetta, ma tu mi stai dicendo che ti stampa 0 e 1, e poi la serie corretta? allora basta che modifichi il ciclo di stampa così:
Codice:
for(i=2;i<n;i++)
  if(a[i]==1)
    printf("%d", i);

Ultima modifica di pisto : 18-07-2007 alle 15:17.
  Rispondi citando il messaggio o parte di esso
Old 18-07-2007, 16:19   #14
mastoo
Member
 
Iscritto dal: Apr 2006
Città: V.E. (na)
Messaggi: 115
Quote:
Originariamente inviato da xbubbax Guarda i messaggi
ho provato a mettere il pezzo che dici tu ma mi da sempre 0 e 1, come se il 2,3,5 ecc..non li conta come primi, forse sbaglio quando stampo il risultato

#include <stdio.h>
#define SIZE 20

int main(){

int n;
int a[n]; é qui il problema
int i;
int j=2;

printf("Inserisci un intero n:\n");
scanf("&d", &n);

for(i=0;i<n;i++){
a[i]=1;}


for(j=2;j<=n/2;j++){
for(i=2;i<=n/j;i++){
a[j*i]=0;
}
}
for(i=0;i<n;i++){
if(a[i]==1){
printf("%d\n", i);}}
il fatto è che quel vettore non ha una dimensione n come credi tu perche la variabile n non è stata inizializzata protrebbe contenere qualsiasi valore intero
devi fare come ti ha detto mapomapo o fai il vettore di dimensione fissa
cosi tipo
Codice:
#include <stdio.h>
#define SIZE 20

main()
{

	int a[SIZE+1]; 
	int i, j;

	for(i=0;i<SIZE;i++)
		a[i]=1;
	
	
	for(j=2;j<=SIZE/2;j++)
		for(i=2;i<=SIZE/j;i++)
			 a[j*i]=0;


	/*stampa*/
	for(i=2;i<SIZE;i++)
		if(a[i]==1)
			printf("%d\n", i);
	 
		
}
mastoo è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2007, 17:49   #15
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
e volendo modificare il mio senza riscrivere tutto quel pezzo come posso fare?

cioè al poso di a[n] cosa dovrei metterci?

che significa fare un vettore di dimensioni fisse?
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2007, 18:16   #16
pisto
 
Messaggi: n/a
beh insomma ti è stato detto tutto quello che devi fare, adesso il codice lo butti giù tu, sei tu che devi imparare C no? devi trovare il modo per creare un array a runtime visto che il limite fino a quale cercare i numeri primi lo decidi a runtime, non stabilito in fase di compilazione.
guarda il codice di mapomapo

Ultima modifica di pisto : 18-07-2007 alle 18:18.
  Rispondi citando il messaggio o parte di esso
Old 18-07-2007, 19:35   #17
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
ho capito, non so se ci sarei arrivato però.. il mio mi sembrava perfetto
xbubbax è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi In sella alla Fiido Nomads Pro: e-bike con motor...
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto ASUS Zenbook 14 (UX3480AA): tanta autonomia con ...
MSI PRO MAX: QD-OLED ultrawide per lavorare, creare e giocare MSI PRO MAX: QD-OLED ultrawide per lavorare, cre...
Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura Samsung Micro RGB R95H, il primo LCD a LED rossi...
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre iPhone 18 Pro: la recensione del miglior iPhone ...
Addio conversioni: Google Drive e Docs o...
Arriva il portale di Google che smascher...
Gli iPhone 18 Pro non convincono: Apple ...
NVIDIA torna su macOS con un driver non ...
Engwe ha un modello che è il SUV ...
Le migliori offerte del weekend Amazon: ...
Cina e UE, intesa sulle auto ibride: Pec...
2 lavatrici slim COMFEE’ a 255€ o 280€ s...
Anche a ottobre tornano i coupon nascost...
Robot ECOVACS DEEBOT MINI a 198,98€ su A...
E-bike in offerta: una in stile Engwe a ...
Auricolari Motorola Moto Buds a 24,90€: ...
Tim Berners-Lee a Torino: 'Voglio un'IA ...
Ring ancora a prezzi super su Amazon: ci...
Batterie EV riconfigurabili: fino al 20%...
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: 20:49.


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