nr prime

Multimi. Logica. Functii si lecturi grafice. Functia de gradul II. Vectori in plan. Trigonometrie. Aplicatii ale trigonometriei.
Alexandru18
utilizator
utilizator
Mesaje: 27
Membru din: 15 Noi 2014, 15:24

nr prime

Mesaj de Alexandru18 » 20 Iun 2018, 12:25

Se da un număr natural a, să se verifice dacă a și inversul (oglinditul) lui a sunt ambele numere prime.

Date de intrare
Se citește de la tastatură numărul natural a.

Date de ieșire
Să se afișeze DA dacă numărul a și inversul său sunt ambele prime sau NU, în caz contrar.

Restricții și precizări
1 ≤ a ≤ 2000000000
a nu are ultima cifră 0

Exemplu
Date de intrare Date de ieșire
5 DA
122 NU
17 DA

Pentru aceasta rezolvare nu primesc maximul

#include<iostream>
using namespace std;
int main()
{int a, inv_a;
cin>>a>>inv_a;
while (a!=0)
{ inv_a=inv_a*10+a%10;
a=a/10;
}
int i = 2, este_prim = 1;
while ((i < a)&&(i < inv_a))
{
if ((a % i == 0)&&(inv_a % i == 0))
este_prim = 0;
++i;
}

if ((a == 1)&&(inv_a == 1))
este_prim = 0;
if (este_prim == 1)
cout<<"DA";
else
cout<<"NU";

return 0;
}

A_Cristian
guru
guru
Mesaje: 1976
Membru din: 23 Feb 2015, 17:15

Re: nr prime

Mesaj de A_Cristian » 20 Iun 2018, 12:47

1. Ce valoare are variabila "a", dupa ce calculezi pe inv_a?
2. inv_a trebuie calculat, nu se introduce de la tastatura.
3. Exista algoritmi ceva mai eficienti pentru a afla daca un numar este prim sau nu.
4. Sunt deplasat daca ti-as sugera o incercare de modularizare a programelului? De exemplu, pentru inceput, fa o functie care calculeaza oglinditul unui numar dat ca parametru si o alta functie care verifica daca un numar dat este prim sau nu.

PS: Ai gresit putin aria.

Alexandru18
utilizator
utilizator
Mesaje: 27
Membru din: 15 Noi 2014, 15:24

Re: nr prime

Mesaj de Alexandru18 » 21 Iun 2018, 22:50

tot nu imi iese . Ai putea sa dai o rezolvare mai concreta de rog !

A_Cristian
guru
guru
Mesaje: 1976
Membru din: 23 Feb 2015, 17:15

Re: nr prime

Mesaj de A_Cristian » 21 Iun 2018, 23:25

Posteaza ultima varianta de cod te rog.

Alexandru18
utilizator
utilizator
Mesaje: 27
Membru din: 15 Noi 2014, 15:24

Re: nr prime

Mesaj de Alexandru18 » 22 Iun 2018, 12:07

#include<iostream>
using namespace std;
int main()
{int a, inv_a;
cin>>a>>inv_a;

int i = 2, este_prim = 1;
while ((i < a)&&(i < inv_a))
{
if ((a % i == 0)&&(inv_a % i == 0))
este_prim = 0;
++i;
if (este_prim == 1)
cout<<"DA";
else
cout<<"NU";
}

return 0;
}

A_Cristian
guru
guru
Mesaje: 1976
Membru din: 23 Feb 2015, 17:15

Re: nr prime

Mesaj de A_Cristian » 22 Iun 2018, 17:14

N-ai facut nimic din ce ti-am zis. In continuare citesti de la tastatura inversul numarului dat, doar ca acum nu mai incerci sa calculezi.
Problema pe care o ai este la legile lui De Morgan (https://en.wikipedia.org/wiki/De_Morgan%27s_laws).

Cod: Selectaţi tot

if ((a % i == 0)&&(inv_a % i == 0)) 
trebuie inlocuit cu

Cod: Selectaţi tot

if ((a % i == 0) || (inv_a % i == 0))
O tentativa de cod ceva mai aerisit ar fi mai jos si contine in mare ce ti-am spus:

Cod: Selectaţi tot

#include<iostream>
using namespace std;

int reverse(int x) {
	int retval = 0;
	while (x) {
		retval = retval * 10 + x % 10;
		x /= 10;
	}
	return retval;
}

bool isPrime(int x) {
	bool retval = true;
	if (x < 2)
		retval = false;
	int divisor = 2;
	while (divisor*divisor <= x) {
		if (x % divisor == 0) {
			retval = false;
			break;
		}
		divisor++;
	}
	return retval;
}

int main()
{
	int a;
	cin >> a;
	int inv_a = reverse(a);
	cout << inv_a << endl;
	if (isPrime(a) && isPrime(inv_a))
		cout << "DA" << endl;
	else
		cout << "NU" << endl;
	return 0;
}

Scrie răspuns