long biggestPrime(long number)
{
long div = 2, largestDiv = -1, curr = number;
do
if (curr % div == 0)
{
curr /= div;
if (div > largestDiv)
largestDiv = div;
div = 2;
}
else
div = div == 2 ? 3 : div + 2; // Check only odd numbers (except 2)
while (curr != 1);
return largestDiv;
}
Kodu öyle bırakmıyoruz. Aşağıdaki gibi bırakıyoruz.Kodu bırakıyorum.
Sonsuz döngüye giriyor hocam bu seferde .C data types - Wikipedia
en.wikipedia.org
Buraya bakarsan C dilinde integer değişkenlerin hangi aralıkta veri alabilidklerini görebilirsin. Senin yazdığın sayı için daha büyük veri tipleri kullanman gerek.
Yazdığın sayıya baktımğımda 12 basamaklı yani signed long long int istediğin sayıya uygun olabilir.
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
int eb=1,k,sayi=600851475143;
int i=sayi;
while(i>=2){
i=i-1;
int control=0;
if (sayi%i==0){
for (k=2;k<i;k++){
if(i%k==0)
control++;
else;
}
if (control==0){
if (eb<i)
eb=i;
else
eb =eb;
}
}
}
printf ("%d",eb);
return 0;
}
Kodu öyle bırakmıyoruz. Aşağıdaki gibi bırakıyoruz.
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
int eb = 1;
int sayi = 28;
int i = sayi;
int control = 0;
while(i >= 2){
i--;
control = 0;
if (sayi % i == 0){
for (int k = 2; k < i; k++){
if(i % k == 0){
control++;
break;
}
}
if (control == 0 && eb < i){
eb = i;
}
}
}
printf ("%d\n", eb);
return 0;
}
Sonsuz döngüye giriyor hocam bu seferde
Elinizdeki kod sayi değişkenindeki sayının kendisinden küçük en büyük asal çarpanını buluyor. Ve gördüğüm kadarıyla çalışıyor. Ufak hatalar falan vardı. Düzelttiğim hali böyle.
Kod:#include <stdio.h> #include <stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main(int argc, char *argv[]) { int eb = 1; int sayi = 28; int i = sayi; int control = 0; while(i >= 2){ i--; control = 0; if (sayi % i == 0){ for (int k = 2; k < i; k++){ if(i % k == 0){ control++; break; } } if (control == 0 && eb < i){ eb = i; } } } printf ("%d\n", eb); return 0; }
O tamamen algoritmanın yavaşlığından. Yazdığın algoritman n^2 de çalışıyor yani input sayının karesi kadar dönüyor. Daha iyi bir algoritma ile bu süreyi azaltman gerek. Asal sayı bulma algoritması olarak sieve of eratosthenes algoritmasına araştırmanı ve göz atmanı öneririm.
Eğer hayır yok ben yapacağım dersen de aklıma gelen kçük iyileştirmeleri yapabilirsin. Örneğin 2 harici çift sayı yoktur o yüzden tüm sayıları gezmek yerine sadece tek sayıları gezebilirsin.
Long için yazmamıştım. Ki bence gerek yok. O kadar büyük sayıların en büyük asal bölenleri bir işinize yarayacağını sanmıyorum. Algoritma için programı yazmanızı kabul edebilirim ama 32 bitten büyük sayılar için uğraşmanızı anlamıyorum.Hocam teşekkür ederim hatalarımı düzelttiğiniz için lakin büyük sayılarda hala aynı uyarıyı veriyor.
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
int main(){
long long int eb = 1;
long long int sayi = 2500000000;
long long int i = sayi;
int control = 0;
while(i-- >= 2){
control = 0;
if (sayi % i == 0){
for (long long int k = 2; k < i; k++){
if(i % k == 0){
control++;
break;
}
}
if (control == 0 && eb < i){
eb = i;
}
}
}
printf ("%lld\n", eb);
return 0;
}
long biggestPrime(long number)
{
long div = 2, largestDiv = -1, curr = number;
do
if (curr % div == 0)
{
curr /= div;
if (div > largestDiv)
largestDiv = div;
div = 2;
}
else
div = div == 2 ? 3 : div + 2; // Check only odd numbers (except 2)
while (curr != 1);
return largestDiv;
}
Bu sitenin çalışmasını sağlamak için gerekli çerezleri ve deneyiminizi iyileştirmek için isteğe bağlı çerezleri kullanıyoruz.