前一段时间,以下问题是泛滥的编程论坛。
找出第四个素数N,使得N = NumberOfDigits(Q),其中N是素数,Q是素数AND(其中Q =(2 ^ p)-1),其中P是素数。
我们正在寻找Judagrali系列中的第2、3、4素数N及其
相应的Q和P值。
提示:
1第四个N对应一个非常大的Q。
计算。
2计算效率很重要。
3必须使用面向对象和继承。 即N是素数和子集
Q的(子类),Q也是素数,P的子集也是素数。
显然在面试中有人问过。
这些提示是完整的赠品。
1第四个N对应一个非常大的Q。
计算。
这很简单。 无论我们用来存储Q的任何变量都需要能够存储大整数(我将使用java.math.BigInteger)。
2计算效率很重要。
我将仅使用java.math.BigDecimal的nextProbablePrime方法生成素数。
3必须使用面向对象和继承。 即N是素数和子集
Q的(子类),Q也是素数,P的子集也是素数。
从P和Q之间的关系开始,P只是一个(素数)数。
class P {
BigInteger value;
public P(BigInteger p) {
value = p;
}
public P() {}
}
如您所见,P根本没有意思。 它只是将BigInteger值存储在一个值变量中。 唯一重要的是它必须仅存储质数。 isJudagrali方法仅测试value是否为质数。
现在,将Q和P的关系指定为Q =(2 ^ p)-1。根据该关系,如果我们有P,则可以轻松获得Q。 但是,要使该Q成为我们序列的有效数字,它(Q)也必须是质数。 它也必须是质数的事实意味着Q类可以扩展P。从P继承的isJudagrali方法在这里仍然适用。 关系Q =(2 ^ p)-1在Q的构造函数中很容易实现。
class Q extends P {
public Q() {}
public Q(P p) {
value = BigInteger.ONE.shiftLeft(p.value.intValue())
.subtract(BigInteger.ONE);
}
}
我只是做了一些转变以实现(2 ^ p)。
没有什么邪恶的!
最后一个难题是N。
N是一个Q,因此我们将其扩展为Q。它还应保留给定Q的位数。
构造函数可以再次为我们强制执行该操作:
class N extends Q {
public N(Q q) {
value = numDigits(q.value);
}
public BigInteger numDigits (BigInteger num) {
String s = ""+ num;
return new BigInteger(""+s.length());
}
}
我将用于此的质数生成器仅来自BigInteger类
class PrimeGenerator {
BigInteger current = BigInteger.ONE;
public BigInteger next() {
current = current.nextProbablePrime();
return current;
}
}
主程序没有太多事情要做。 它只是从质数生成器中获取素数,构造一个P及其对应的Q值。 如果满足Q和P关系,则可以构造
如果N是有效的Judagrali,则它将打印出P,Q,N值,直到已打印出其中的4个值为止。
public static void main(String[] args) {
PrimeGenerator g = new PrimeGenerator();
int count = 0;
while (count < 4) {
P p = new P(g.next());
Q q = new Q(p);
if(q.isJudagrali()) {
N n = new N(q );
if(n.isJudagrali()) {
System.out.println("P :" +p.value + " Q: "+q.value + " N :"+n.value);
count++;
}
}
}
}
无需测试P是否为素数,因为希望我们的素数生成器是正确的!
From: https://bytes.com/topic/algorithms/insights/857844-judagrali-series
本文介绍了一种利用Java面向对象编程和BigInteger类解决数学难题的方法,具体目标是找到Judagrali数列中的特定素数N,其中N等于Q的位数,而Q=(2^p)-1且P为素数。文章详细阐述了如何通过继承构建P、Q和N类,并使用PrimeGenerator生成素数。
961

被折叠的 条评论
为什么被折叠?



