Răspuns :
Cerinta
Sa se afișeze numerele prime de 3 cifre care citite invers sunt tot numere prime.
Rezolvare (Program C++ explicat) :
#include <iostream>
using namespace std;
bool verificare_prim(int n){
//Functie care returneaza 1 daca numarul n este prim, 0 altfel
if(n<2) return 0;
if(n==2) return 1;
bool prim=1;
for(int i=2;i<n;i++)
if(n%i==0)return 0;
return 1;
}
int rasturnat(int n){
//Returneaza rasturnatul numarului n
int r=0;
while(n){
r=r*10+n%10;
n=n/10;
}
return r;
}
int main(){
//Pentru fiecare numar de trei cifre
for(int i=100;i<=999;i++){
//Verifica daca e prim si daca rasturnatul sau este prim.
if(verificare_prim(i)&&verificare_prim(rasturnat(i)))
cout << i << " ";
}
}
Rezolvare (Program C++ fara functii)
#include <iostream>
using namespace std;
int main(){
bool prim=1;
//Pentru fiecare numar de trei cifre
for(int k=100;k<=999;k++){
int i=k;
//Verifica daca e prim.
prim=1;
for(int j=2;j<i;j++)
if(i%j==0) prim = 0;
if(prim){
//Determinare rasturnat
int r=0;
while(i){
r=r*10+i%10;
i=i/10;
}
//Verificare daca rasturnatul este prim.
prim = 1;
for(int j=2;j<r;j++)
if(r%j==0) prim = 0;
//Afisare mesaj
if(prim) cout << k << " ";
}
}
}
Rezolvare (valori) :
101 107 113 131 149 151 157 167 179 181 191 199 311 313 337 347 353 359 373 383 389 701 709 727 733 739 743 751 757 761 769 787 797 907 919 929 937 941 953 967 971 983 991
Nota :
1. Exista posibilitatea de a face programul mult mai eficient, totusi aceasta este una dintre cele mai usoare variante de inteles. (Verificarea faptului ca un numar este prim poate fi folosita mai eficient parcurgand numerele mai mici decat n doar pana la valoarea [tex]\sqrt{n}[/tex], ba chiar exista algoritmi mai eficienti pentru testarea primalitatii unui numar. Mai mult de atat, domeniul de valori testate putea fi mult mai mic, stiind ca un numar par de 3 cifre nu este prim - implicit prima cifra nu poate fi nici aceasta un numar par, avand conditia ca rasturnatul numarului sa fie si acesta un numar prim.) In plus, am folosit forma generala a functiilor, unele conditii nu sunt absolut necesare pentru problema data.
2. Observam cat de utila este folosirea functiilor definite de utilizator si cat de lizibil este programul cand le folosim.
VARIANTA MAI CLEAN PUTIN SI MAI EFICIENT LA INVERSARE CAT SI LA PRIMALITATE (AM SI MAI EFICIENT)
#include<iostream>
using namespace std;
int main() {
for (int i = 101; i <= 991; i++) {
int k = 2;
if (i % 2 == 0 || i % 3 == 0)
k++;
for (int d = 5; d * d <= i; d += 6)
if (i % d == 0 || i % (d + 2) == 0)
k++;
if (k == 2) {
int kk = 2, ii = 0;
ii = (i % 10) * 10 + ((i / 10) % 10) * 10 + i / 100;
if (ii % 2 == 0 || ii % 3 == 0)
kk++;
for (int dd = 5; dd * dd <= ii; dd += 6)
if (ii % dd == 0 || ii % (dd + 2) == 0)
kk++;
if (kk == 2)
cout << i << ' ';
}
}
return 0;
}