您的位置:首页 > 其它

project euler 97

2015-12-22 18:32 351 查看


Problem
97

Large non-Mersenne prime

The first known prime found to exceed one million digits was discovered in 1999, and is a Mersenne prime of the form 26972593−1; it contains exactly 2,098,960
digits. Subsequently other Mersenne primes, of the form 2p−1, have been found which contain more digits.

However, in 2004 there was found a massive non-Mersenne prime which contains 2,357,207 digits: 28433×27830457+1.

Find the last ten digits of this prime number.

非梅森大素数

1999年人们发现了第一个超过一百万位的素数,这是一个梅森素数,可以表示为26972593−1,包含有2,098,960位数字。在此之后,更多形如2p−1的梅森素数被发现,其位数也越来越多。

然而,在2004年,人们发现了一个巨大的非梅森素数,包含有2,357,207位数字:28433×27830457+1。

找出这个素数的最后十位数字。

package projecteuler;

import java.util.Arrays;

import junit.framework.TestCase;

public class Prj97 extends TestCase {

public static final int LIMIT = 10;

/**
* 28433^7830457+1
*/
public void testLargeNonMersennePrime() {

int start = 28433;
int[] arr = enLarge(int2Arr(start), LIMIT);

int power = 7830457;
while (power > 0) {
arr = multiply(arr, 2);
power--;
}

arr = add(arr, enLarge(int2Arr(1), LIMIT));

for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}

}

int[] multiply(int[] arr, int b) {

int[] ret = Arrays.copyOf(arr, arr.length);

for (int i = 0; i < arr.length; i++) {
ret[i] *= b;
}

for (int i = arr.length - 1; i > 0; i--) {

ret[i - 1] = ret[i - 1] + ret[i] / 10;
ret[i] = ret[i] % 10;
}
ret[0] %= 10;

return ret;
}

int[] add(int[] a, int[] b) {
assert (a.length == b.length);

int[] ret = Arrays.copyOf(a, a.length);
for (int i = a.length - 1; i > 0; i--) {

int val = a[i] + b[i];

ret[i] = val % 10;
ret[i - 1] = ret[i - 1] + val / 10;
}

ret[0] %= 10;
return ret;
}

int[] int2Arr(int val) {

String str = Integer.toString(val, 10);
int[] ret = new int[str.length()];
for (int i = 0; i < ret.length; i++) {
ret[i] = Integer.parseInt(String.valueOf(str.charAt(i)));
}
return ret;
}

int[] enLarge(int[] val, int bits) {

assert (val.length <= bits);

int[] ret = new int[bits];

for (int i = bits - val.length, j = 0; i < bits; i++, j++) {
ret[i] = val[j];
}
return ret;

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: