numeri primi minori di x

Stato
Discussione chiusa ad ulteriori risposte.

imported_lepa

Utente Silver
28 Settembre 2008
266
11
1
99
In pratica dovete trovare tutti i numeri primi minori di un numero x


Codice:
#include <iostream>
using namespace std;

bool numero_primo(int n)
{
     for (int j=2; j<n; j++) {if (n%j==0) return false;}
     return true;
}


int main()
{
    int x;
    cout << "Inserisci il numero\n";
    cin >> x;
    for (int z=2; z<=x; z++) { if (numero_primo(z)) cout << z << endl;}
    return 0;
}
 
[Ruby]
Codice:
#!/usr/bin/ruby
def isPrime(num)
  (2 .. (num/2).to_i).each do |i|
    return false if num%i==0
  end
  return true
end
tot=gets().to_i
(tot+1).times do |i|
  puts i if isPrime(i)
end
 
(PHP)
PHP:
<?php
function isnumeroprimo($n) {
	for ($i=2;$i<$n;$i++) {
		if ($n%$i == 0) {
			return FALSE;
		}
	}
	return TRUE;
}
$numero = $_GET['num'];
for ($m=2;$m<=$numero;$m++) {
	if (isnumeroprimo($m)) {
		echo "$m<br>";
	}
}
?>
 
simus94, mi sa che è sbagliato, perchè se metti nel ciclo for "return true" qualunque numero dispari te lo farà tornare primo così....dovresti metterlo fuori dal ciclo for.
N.B. Non conosco il PHP, potrei avere sparato una stronzata megagalattica e ne sono conscio

ps: il mio lo fa, perchè se dai a x 2 , il ciclo si verifica solo se x è maggiore o uguale a z, essendo z uguale a 2, il ciclo si verifica ed esce fuori il numero 2
 
Lepa, hai perfettamente ragione XD, scusami, alle 3 di notte non sono tanto vispo :confused:. Comunque ho corretto gli errori, e il 2 viene stampato anche da me adesso ;).
 
Eccolo anche in Python:
Codice:
#!/usr/bin/python
def isnumeroprimo(numero):
	for i in range(2, numero):
		if numero%i == 0:
			return 0
	return 1

n = input ("Inserisci un numero:\n")
for m in range(2, n):
	if isnumeroprimo(m):
		print m
 
Ecco il mio in C, non è dei più brevi ma mi sembra più che ottimo,[/php] poi non so se voi crediate il contrario:
Codice:
#include <stdio.h>

int numprim(int x);

main()
{
int x;
printf("Inserisci un numero:\n");
scanf("%d", &x);

	if(x>0)
	{
	printf("I numeri primi tra 1 e %d sono i seguenti:\n", x);
	int y=1;
		
		while(y<=x)
		{
		if(numprim(y)==0)
		printf("%d\n", y);
		y++;
		}

	}
	else
	printf("Errore il numero deve essere maggiore di 0!\n");
}

int numprim(int x)
{
int y=1, z=0;

	for(y;y<=x;y++)
	{
		if(x%y==0)
		z +=1;
	}

	if(z==2)
	return 0;
	else
	return 1;
}
 
mmm... forse si, hai ragione jacoboss, ma a finale quello è l'algoritmo del prog...magari potrei un pò ottimizzarlo di più, levandoci quel controllo sulla variabile di input poi non saprei, voi che mi dite?
 
Genks ha detto:
mmm... forse si, hai ragione jacoboss, ma a finale quello è l'algoritmo del prog...magari potrei un pò ottimizzarlo di più, levandoci quel controllo sulla variabile di input poi non saprei, voi che mi dite?

no nel senso questo è una cosa normale si può fare sia più leggero che più pesante non è nulla di strano... puoi fare anche dei controlli sull'integrità dei dati... ad esempio se scrivi 's' invece di '4' che succede?
si pianta il programma ora io mi ricordavo come fare con cin e cout ma con printf e scanf no comunque ci puoi lavorare molto di più o molto di meno
questo è una via di mezzo carino semplice immediato ma nulla di eccezzionale capito cosa dicevo?
 
penso di si, nel senso che per arrivare alla soluzione del problema con l'algoritmo, puoi benissimo fare un programma di intere pagine, pieni di controlli, cicli etc. etc., che un semplice programma immediato, veloce e semplice, l'importante è il risultato finale! giusto?
 
in java
usando il crivello di Eratostene
Codice:
class primi
{
   static int max=1000;
   int [] numeri = new int[max];
    public Eratostene()
   {
        int i;
        for (i=0;i<max;i++)
        {
             numeri[i]=i+1;
             primi[i]=true;
         }
    }
    void elMul(int a)
   { 
        for (int j=2;j*a<=MAX;j++)
                               primi[(j*a)-1]=false;
    }
   int prossimo(int n)
    {
     int tmp=n;
     while (!primi[tmp]) {
         tmp++;
     if (tmp>=MAX) break;
     }
     return tmp+1;
     }
      void calcolaPrimi()
      {
           int num=2; while (num<=MAX)
           {
            elMul(num);
           num=prossimo(num);
           };
       }
       void scriviPrimi() {
       System.out.println("il numero di numeri primi fino ad "+MAX+" sono:");
      for (int i=0; i < MAX ; i++)
      if (primi[i]) System.out.print(numeri[i]+" ");
      }
       public static void main(String[] args)
       {
           Eratostene e = new Eratostene(); e.calcolaPrimi();                       /**/     e.scriviPrimi(); 
        }
}
 
python:
Codice:
#!/usr/bin/python
def is_prime(n):
	for i in range(2,n):
		if n % i == 0:
			return 0;
	return 1;
a = input("Insert the limit >");
for i in range(2,a):
	if is_prime(i):
		print i;
EDIT:
php (command line):
Codice:
<?php
error_reporting("E_ALL &~ E_NOTICE &~ E_WARNING");
if($argc < 2) {
	print "Usage: ".$argv[0]." limite";
	exit(1);
}
function is_prime($n) {
  	$prime = 1;
	if ($n == 2) return $prime;
	if (($n % 2) == 0) return 0;
	for ($i=3;$i<$n;$i+=2) {
		$q = $n % $i;
		$prime = (($n % $i) == 0) ? 0 : 1;
	}
	return $prime;
}
for($i=0;$i<(int)$argv[1];$i++)
	if(is_prime($i))
		print $i."\n";
?>
 
Stato
Discussione chiusa ad ulteriori risposte.