Rozłożenie liczby na czynniki pierwsze

0

Napisałem program, który rozkłada liczbę na czynniki pierwsze.

public class ProjectEuler3 {
	public static void main (String[] args) {
		int liczba = 2000;
		double pierwiastek = Math.sqrt(liczba);
		int i = 2;
		while (i < pierwiastek) {
			if (liczba % i == 0) {
				System.out.println(liczba + " / " + i);
				liczba = liczba / i;
				continue;
			}
			if (liczba % i != 0)
				i++;
		}
	}
}

W przykładzie na czynniki pierwsze rozkładana jest liczba 2000.
Wynik programu:

2000 / 2
1000 / 2
500 / 2
250 / 2
125 / 5
25 / 5
5 / 5

Czy znajdzie się ktoś kto doradzi mi jak przerobić programik tak aby można było rozłożyć liczbę 600851475143? Nie chcę gotowca tylko jakieś podpowiedzi abym mógł to sam zrobić. Próbowałem za pomocą typu long oraz BigInteger i coś mi nie wychodzi.

2

Zmień typ int na long, zmienną deklaruj tak:

long liczba = 600851475143l;

l na końcu jest ważne!

0

No i wszystko jasne. Dzięki bogdans! Ja nie dodawałem na końcu liczby L i dlatego long mi nie działał poprawnie. W książce miałem napisane L przy longach, ale nie spodziewałem się, że to jest konieczne. Myślałem, że to tylko do rozróżnienia.

MSM, wygląda to tak:

long liczba = 600851475143L; //wszystko działa jak powinno
long liczba = 600851475143; // BŁĄD - The literal 600851475143 of type int is out of range
0

A gdybym teraz tak chciał przerobić ten program, aby na wejściu prosił on użytkownika o podanie liczby. No to wiadomo, że user nie wpisywałby na końcu dodatkowego L. Jak to opracować w programie? Do pobranego Stringa dodam L, a później String mam przekonwertować na long? To będzie dobre rozwiązanie czy zrobilibyście to jakoś inaczej?

0

Ja bym zrobił tak:

boolean ok = true;
Scanner sc = new Scanner(System.in);
System.out.println("Podaj liczbe (miedzy 2 a "+Long.MAX_VALUE+"): ");
try
{
    long liczba = sc.nextLong();
    ok = (liczba>=2);
}
catch(NumberFormatException e)
{
    ok = false;
}
if(!ok)
{
    System.out.println("Przeczytaj uwaznie polecenie");
}
0

Aha ;-) Patrząc w kod to łapię co gdzie się robi, ale sam bym tego napisać nie umiał, nie znam jeszcze tych wszystkich funkcji. Usiądę później to poczytam o nich.

0

sqrt[600851475143]=775146, oraz: 600851475143 = 718391471*6857

   i      liczba        i^2
------------------------------
   1   600851475143         1
  71     8462696833      5041
 939       10086647    881721
1471           6857   2163841

czyli: już gdy dokręciłeś się do 1471 wiesz, że nie musisz liczyć aż do 775146.
Zapisałem sobie to w C, "twoim" sposobem liczbę 600851475143 potrafiłem rozłożyć 65 razy
gdy w tym samym czasie, troszkę poprawionym programem mogłem to zrobić 50 000 razy.
Trzeba by sprawdzić co lepsze, liczyć 1471 razy kwadrat, czy 4 razy pierwiastek

0

Chyba źle postawiłeś nawiasy [sqrt(600851475143)]=775146.
W javie kod

long liczba = 600851475143L;
double pierwiastek = Math.sqrt(liczba);
long i = 2;
while (i < pierwiastek) 
{
     if (liczba % i == 0) 
     {
          liczba = liczba / i;
          pierwiastek = Math.sqrt(liczba);
     }
     else
     {
          i++;
     }
}

jest mniej więcej 550 razy szybszy niż poniższy (a też znajduje czynniki pierwsze)

long liczba = 600851475143L;
double pierwiastek = Math.sqrt(liczba);
long i = 2;
while (i < pierwiastek) 
{
     if (liczba % i == 0) 
     {
          liczba = liczba / i;
     }
     else
     {
          i++;
     }
}
0

"chyba źle..."
raczej leniwie. Ciekawe czy są klawiatury dzięki którym shift używany jest tylko do zaznaczania i pojedynczych wielkich liter?

a zamiast i++ przyśpieszymy znacznie pisząc i+=6

1 użytkowników online, w tym zalogowanych: 0, gości: 1