Я сделал программу на Java, которая вычисляет мощности двух, но кажется очень неэффективной. Для меньших степеней (например, 2^4000) он делает это менее чем за секунду. Тем не менее, я рассматриваю вычисление 2^43112609, что на один больше, чем наибольшее из известных простых чисел. Имея более 12 миллионов цифр, это займет очень много времени. Вот мой код:Вычисление чрезвычайно больших мощностей 2
import java.io.*;
public class Power
{
private static byte x = 2;
private static int y = 43112609;
private static byte[] a = {x};
private static byte[] b = {1};
private static byte[] product;
private static int size = 2;
private static int prev = 1;
private static int count = 0;
private static int delay = 0;
public static void main(String[] args) throws IOException
{
File f = new File("number.txt");
FileOutputStream output = new FileOutputStream(f);
for (int z = 0; z < y; z++)
{
product = new byte[size];
for (int i = 0; i < a.length; i++)
{
for (int j = 0; j < b.length; j++)
{
product[i+j] += (byte) (a[i] * b[j]);
checkPlaceValue(i + j);
}
}
b = product;
for (int i = product.length - 1; i > product.length - 2; i--)
{
if (product[i] != 0)
{
size++;
if (delay >= 500)
{
delay = 0;
System.out.print(".");
}
delay++;
}
}
}
String str = "";
for (int i = (product[product.length-1] == 0) ?
product.length - 2 : product.length - 1; i >= 0; i--)
{
System.out.print(product[i]);
str += product[i];
}
output.write(str.getBytes());
output.flush();
output.close();
System.out.println();
}
public static void checkPlaceValue(int placeValue)
{
if (product[placeValue] > 9)
{
byte remainder = (byte) (product[placeValue]/10);
product[placeValue] -= 10 * remainder;
product[placeValue + 1] += remainder;
checkPlaceValue(placeValue + 1);
}
}
}
Это не школьный проект или что-то еще; просто для удовольствия. Любая помощь в том, как сделать это более эффективным, будет оценена по достоинству! Благодаря!
Kyle
P.S. Я не упомянул, что выход должен быть в base-10, а не двоичном.
двоичное представление очень просто: 1000 ... 00 :) вы не просто хотите вычислить 2^N, но печатать как десятичную, так? – Andrey
хорошая задача от Project Euler :) – Andrey