Wątek przeniesiony 2019-01-11 08:24 z C# i .NET przez Adam Boduch.

Sprawdzanie czy liczba jest pierwsza

0

Robię zadanie ktorego celem jest sprawdzenie czy liczba jest pierwsza. Najpierw wpisuje ilosc liczb w tablicy, potem kolejno pozycje w tablicy. Program sprawdza, a nastepnie wypisuje po kolei czy liczba jest pierwsza.

Np:
Wpisuje 2 3 6
Wyswietla sie 1 0

int pierwsza(int tab[], int n)
{

   for (int i=0;i<n;i++){
   	
   	if (tab[i]<2){
	   cout<<"0 ";
   }
   for(int j=2;j*j<=tab[i];j++)
   {
   
   if (tab[i]>=2 && tab[i]%j==0 ) 
   {
   	cout<<"1 ";
   }
   }
   }}

Program wyswietla tylko 1 liczbe, mimo ze jest wiecej indeksow w tabeli

1

Po pierwsze obowiązkowo obejrzyj to.
Po drugie sformatuj ten kod (twoje IDE powinno to potrafić jak nie to użyj: http://format.krzaq.cc/), co da np:

int pierwsza(int tab[], int n)
{
    for (int i = 0; i < n; i++) {
        if (tab[i] < 2) {
            cout << "0 ";
        }

        for (int j = 2; j * j <= tab[i]; j++) {

            if (tab[i] >= 2 && tab[i] % j == 0) {
                cout << "1 ";
            }
        }
    }
}

Po trzecie ta twoja funkcja nie robi nic związanego ze swoją nazwą. Zamiast cout pewnie miało być coś innego.
Najlepiej podziel to na mniejsze funkcję tak (będzie ci łatwiej ogarnąć):

bool pierwsza(int x)
{
     ....
}

void drukujCzyPierwsze(int tab[], int n)
{
    for (int i = 0; i < n; i++) {
          if (pierwsza(tab[i])) {
              cout << "1 ";
          } else {
              cout << "0 ";
          }
    }
}
0
bool f5(int n, int tab[]) {
	for (int j = 0; j < n; j++) {


		if(tab[j]<2)
			return false; 

		for(int i=2; i*i<=tab[j]; i++)
			if(tab[j]%i==0)
				return false; 
		return true;
	}
}

void WyswietlCzyPierwsza(int tab[], int n) {
	for (int i = 0; i < n; i++) {
		if (f5(n, tab)) {
			cout << "1 ";
		} else {
			cout << "0 ";
		}
	}
}

Teraz mam 2 takie funkcje, ale problem jest taki ze wyswietla dla np ciagu licz 3 8 12 14 jakby wszystkie byly pierwsze.

0

Czyli lepiej dac petle przed funkcje?

0
fredek13 napisał(a):

Czyli lepiej dac petle przed funkcje?

he?

W tej tablicy masz liczby do przetestowania. To czy druga liczba jest pierwsza czy nie, nie ma wpływu na to, czy piąta liczba jest pierwsza czy nie.
Ergo żeby sprawdzić czy liczba jest pierwsza nie jest ci potrzebna, żadna inna.

0

Ale skoro w tablicy jest pare liczb, to pare razy musi sprawdzic czy jest pierwsza

0

Przecież, Masz rozwiązanie powyżej, dodam Ci tylko trochę lepszą niż naiwna funkcję testującą pierwszość:

#include <stdio.h>

typedef unsigned long long int ull_int;

int prime_test(ull_int n){
	if (n <= 3) return n > 1;
	else if ( (n % 2 == 0) || (n % 3 == 0) ) return 0;
	ull_int i = 5;
	while ( i * i <= n){
		if ( (n % i == 0) || ( n % (i + 2) == 0) )
			return 0;
		i += 6;
	}
	return 1;
}

void primesArray(ull_int * arr, int len) {
	for (int i = 0 ;i < len ; i++) {
		if (prime_test(arr[i]))
			printf("%d ", 1);
		else 
			printf("%d ", 0);
	}
	printf("\n");
}
int main(){
	ull_int tab[6] = {2, 10, 3, 1, 137, 90};
	primesArray(tab, sizeof(tab) / sizeof(tab[0]));
	// -> 1 0 1 0 1 0
	return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1