C/C++ C++ Prime Numbers Between N1 and N2

SubhanXd

Centipat
Katılım
5 Kasım 2022
Mesajlar
186
Çözümler
1
Selamlar. Yapmam gereken: Prime Numbers Between N1 and N2.
Yazdığım kod:

Kod:
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

 
int main() {
 int num1 ;
 int num2 ;
bool isPrime = true ;
cin >> num1 ;
cin >> num2 ;
for (int i = num1  ; i <=num2 ; ++i ) {
 for (int f =2 ; f <= i / 2; ++f) {
   if (i%f==0) {
 isPrime = false;
break ;
}

}
 if (isPrime==true ) {
 cout << i << endl ;

}

}

}

 
Kodunuzda, bir sayı asal olmadığında Isprime'ı sıfırlıyorsunuz ama sonra tekrar True'ya çevirmiyorsunuz. Bu yüzden, bir sayı asal olmadığında, bundan sonraki tüm sayılar asal değilmiş gibi gözüküyor. Asal sayı kontrolü için sayının yarısına kadar gitmek yerine, kareköküne kadar gitmek daha hızlı sonuç verir.
 
Kodunuzda, bir sayı asal olmadığında Isprime'ı sıfırlıyorsunuz ama sonra tekrar True'ya çevirmiyorsunuz. Bu yüzden, bir sayı asal olmadığında, bundan sonraki tüm sayılar asal değilmiş gibi gözüküyor. Asal sayı kontrolü için sayının yarısına kadar gitmek yerine, kareköküne kadar gitmek daha hızlı sonuç verir.
Hocam tavsiye için teşekkürler ama benim kodumda hata tam olarak nerede?
 
Hocam tavsiye için teşekkürler ama benim kodumda hata tam olarak nerede?
Kodunuzdaki temel sorun, isPrime değişkenini her yeni sayı için true olarak başlatmamanız. Böylece, eğer bir kez isPrime false olarak ayarlanırsa, o ve sonraki tüm sayılar için asal olmayan olarak kalır. Bu, algoritmanın doğru çalışmamasına yol açar. Ayrıca, asal sayı kontrolü için yarıya kadar gitmek yerine, sayının kareköküne kadar gitmek yeterli ve daha verimli olacaktır. İşte kodunuzdaki hata:

for (int i = num1 ; i <=num2 ; ++i ) {
for (int f =2 ; f <= i / 2; ++f) {
if (i%f==0) {
isPrime = false;
break ;
}
}
if (isPrime==true ) {
cout << i << endl ;
}
}


Her bir i için isPrime değişkenini true olarak başlatmanız gerekiyor. Ayrıca, i'nin yalnızca kareköküne kadar olan sayılara bölünüp bölünmediğini kontrol etmelisiniz. İşte düzeltilmiş hali:

for (int i = num1; i <= num2; ++i) {
bool isPrime = true; // Her sayı için bu değeri true olarak başlatın.
if (i < 2) isPrime = false; // 2'den küçük sayılar asal değildir.
for (int f = 2; f <= sqrt(i); ++f) { // Kareköküne kadar kontrol edin.
if (i % f == 0) {
isPrime = false;
break;
}
}
if (isPrime) { // Eğer isPrime hala true ise, sayı asaldır.
cout << i << endl;
}
}
 

Technopat Haberler

Yeni konular

Geri
Yukarı