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;
}
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.
Aklıma şöyle basit bir algoritma geldi ama doğruluğunu bol bol test etmek lazım.
Algoritmayı şöyle:
2'den başlıyoruz ve sayı 2'ye tam bölündüğü sürece 2'ye bölüyoruz.
Bölünememeye başladığında 3'ü deniyoruz ve sürekli bölünemediği sürece tek sayılar üzerinde devam ediyoruz. En son tam bölen sayı bize sonucu veriyor.
İstiyorsan tüm bölenleri bul çarp ve doğruluğunu ispatla programın. Ben denemedim aklıma geldi böyle çözüm sundum.
[CODE lang="c" title="En büyük asal bölen"]#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
signed long long sayi = 5646676815, devider = 2;
while (!sayi % devider)
sayi /= devider;
devider++;
while (sayi != 1)
{
if (sayi % devider == 0)
sayi /= devider;
else.
devider += 2;
}
printf("%llu \n", devider);
return 0;
}[/CODE]
Bu soru bana bir yerden tanıdık geliyor ama...
Sorununuz kaynağı ınteger overflow. Signed 32 Bit ınteger Max değeri 2, 147, 483, 647'dir.
Bu sitenin çalışmasını sağlamak için gerekli çerezleri ve deneyiminizi iyileştirmek için isteğe bağlı çerezleri kullanıyoruz.