Я хотел бы распространять большие числа на простые коэффициенты. Для того, чтобы сделать что Im используя свою версию Решето Эратосфена (в основном я, сохраняя наименьший простой множитель каждого числа в диапазоне в массиве)Распространение длинных чисел на простые множители
protected final static int PowOf2= 21;
protected final static int[] Sieve = new int[(int) Math.pow(2,PowOf2)];
protected final static int range = (int) Math.pow(2,PowOf2); //range of long types
static int a=0; //counter
public static void init(long n){
for(int i=0; i<range-1; i++){
Sieve[i]=i; //at first every number is equal to it's index
}
for(int i = 2; i*i <= range-1; i++)
{
if (Sieve[i] == i){
for (int j = 2 * i ; j <= range-1; j += i)
{
Sieve[j] = i; //after that every number(index) has a smallest prime factor assigned to it
}
}
}
}
Затем я использую этот массив разделить данное число на простые множители
public static long[] intoPrimeFactors (long n){
long[] array = new long[range-1];
while(!isPrime(n)){
array[a]=Sieve[(int)n]; //here's an error
n/=Sieve[(int) n];
a++;
}
array[a]=n;
return array;
}
в основном я printig из всех факторов
public static void main(String[] args){
long n=new Long(args[0]);
init(Math.abs(n));
long[] array = intoPrimeFactors(Math.abs(n)); //here's an error
System.out.print(n+" = ");
if(n<0){
n=Math.abs(n);
System.out.print("-1*");
}
for(int i=0;i<=a;i++){
if(i!=a)System.out.print(array[i]+"*");
else System.out.print(array[i]);
}
}
И это прекрасно работает на небольшом количестве (INT), но когда я печатаю в чем-то, как я получаю 9223371331 ArrayOutOfBo und error (в функциях main и inPrimeFactors), и я не совсем уверен, почему. Не могли бы вы помочь мне ?
Вам может понадобиться использовать BigInteger http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html – Steephen
вы принимаете 'долго 'и кастинг на' int'. Вы не должны рассчитывать на что-либо после этого момента. – Teepeemm