package zj.hy.love;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
/**
* 在‘e’的数列中所能找到的第一个十位数质数
* @author ZJ
* @since 2017-1-3
*/
public class Ques20170103_02 {
private static final BigInteger two = new BigInteger("2");
private static final BigInteger one = new BigInteger("1");
private static final BigInteger zero = new BigInteger("0");
private static final BigInteger oppositeOne = new BigInteger("-1");
/**
* 自然数e = 1/0!+1/1!+1/2!+....+1/(n-1)!+1/n! n=defaultCircle
* 当defaultCircle值越大模拟的自然数e越接近真实值
*/
private static final int defaultCircle = 1000000;
/**
* 存放一百以内的全部质数
*/
private static final List<BigInteger> primeList = new ArrayList<BigInteger>();
static{
// 一百以内的全部素数
int[] prime = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
for (int i = 0; i < prime.length; i++) {
primeList.add(new BigInteger(prime[i]+""));
}
}
/**
* 在任意数字型序列中寻找第一个bit位的质数<br>
* 数字型序列如:46165/1234.8974
* @param array 数字数列
* @param bit 截取字符串的长度
* @return 不存在时返回-1,存在则返回改质数
*/
public BigInteger findTenPrimeOfArray(String array,int bit){
if(array.contains(".")){
String[] a = array.split("\\.");
if(a[0].length()>=bit){
return getFirstTenPrime(a[0],bit);
}
if(a[1].length()>=bit){
return getFirstTenPrime(a[1],bit);
}
}else{
if(array.length()>=bit){
return getFirstTenPrime(array,bit);
}
}
return oppositeOne;
}
/**
* 从左到右依次截取字符串的bit位转换为数字,<br>
* 判断这个数字是否为质数,若是则返回改数字,若不存在返回-1
* @param array 数字型字符串
* @return
*/
private BigInteger getFirstTenPrime(String array,int bit){
int len = array.length();
int i = 0;
BigInteger temp;
boolean flag;
while(i<len-1-bit){
temp = new BigInteger(array.substring(0+i, bit+i));
flag = judgeNumberIsPrime(temp);
if(flag){
return temp;
}
i++;
}
return oppositeOne;
}
/**
* 测试一个数是否为质数<br>
* @param num
* @return
*/
public boolean judgeNumberIsPrime(BigInteger num){
if(num.compareTo(two)==-1){
return false;
}
int size = primeList.size();
for (int i = 0; i < size; i++) {
BigInteger res = montgomery(primeList.get(i),num.subtract(one),num);
if(!res.equals(one)&&!res.equals(zero)){
return false;
}
}
return true;
}
/**
* 蒙哥马利算法
* @param a 底数
* @param b 指数
* @param m 模数
* @return
*/
public BigInteger montgomery(BigInteger n,BigInteger p,BigInteger m){
BigInteger r = n.mod(m);
BigInteger tmp = one;
while(p.compareTo(one)==1){
if(!p.mod(two).equals(zero)){
tmp = tmp.multiply(r).mod(m);
}
r = r.multiply(r).mod(m);
p = p.divide(two);
}
return r.multiply(tmp).mod(m);
}
/**
* 获取自然数e
* @param scale 精度
* @return
*/
public static BigDecimal getNaturalConstant(int scale){
BigDecimal e = new BigDecimal(0);
BigDecimal t = new BigDecimal(1);
for (int i = 1; i < defaultCircle; i++) {
t = t.divide(new BigDecimal(i), scale, BigDecimal.ROUND_HALF_UP);
e = e.add(t);
}
return e;
}
//测试在‘e’的数列中所能找到的第一个十位数质数
public static void main(String[] args) {
Ques20170103_02 ques = new Ques20170103_02();
final int step = 1000;
for (int i = 1; i < 1000; i++) {
String e = getNaturalConstant(step*i).toString();//获取自然数小数点后1000位
String res = ques.findTenPrimeOfArray(e, 10).toString();
if(!oppositeOne.equals(res)){
System.out.println(res);
break;
}
}
}
}
分享到:
相关推荐
从序列的第一个元素开始,依次比较每个元素,直到找到目标值或遍历完所有元素。 #### 二分搜寻法(Binary Search) 二分搜寻法是一种在有序数组中查找特定元素的高效算法,时间复杂度为O(log n)。 **算法流程:**...
1. 第10行左起第一个数的求解,利用归纳推理,我们发现第n行的等式左边是从n+1开始的2n个连续数字的加减,所以第10行的第一个数是120。 2. 三角形中的数字规律问题,可以通过观察三角形中的数字序列,发现左边...
`for`循环适用于已知迭代次数的情况,例如第3题计算阶乘之和、第5题计算级数和、第6题寻找完数和第7题计算特定数字序列之和。`while`循环和`do-while`循环则在迭代次数不确定时使用,例如第8题寻找满足条件的最大正...
1. 连加进位数:在数学中,“连加进位数”是指在进行加法运算时,三个连续的自然数相加会导致至少一位数的进位。例如,4 是一个连加进位数,因为 4 + 5 + 6 = 15 产生了进位。这个问题涉及概率计算,需要确定 100 个...
实现`isP`函数:遍历从2到m-1的所有数,如果m能被其中任意一个数整除,则不是素数,返回0;否则是素数,返回1。 2. 实现`jsValue`函数:初始化计数器s为0,从m+1开始遍历,每次检查当前数是否为素数。如果是素数,...
- 寻找数组中缺失的第一个正整数。 - **2Sum** - 寻找数组中两个数的和等于目标值。 - **3Sum** - 寻找数组中三个数的和等于目标值。 - **3SumClosest** - 寻找数组中三个数的和最接近目标值。 **3. 二分查找...
根据给定文件的信息,我们可以将主要内容分为以下几个部分:数学与公式、大数处理与字符读入、数论算法、图论算法、几何算法以及专题讨论等。下面将逐一展开介绍这些知识点。 ### 一、数学与公式 #### 常用数学...
FFT是一种高效的计算离散傅里叶变换(DFT)的方法,它将一个复数序列的DFT分解成更小的子问题来解决,极大地减少了计算量。DFT是分析信号频率成分的关键工具,在信号处理、图像处理、通信和许多其他领域有着广泛应用...
4. 复数类设计:这是面向对象编程的一部分,需要创建一个`Complex`类,包含两个私有浮点型变量表示实部和虚部,以及对应的公有方法:`Plus`(加法)、`Subtract`(减法)和重写的`ToString`方法。`ToString`方法用于...
- 自然数序列 `range(start, stop[, step])`:生成一个自然数序列,从 `start` 到 `stop - 1`(不包含 `stop`),步长为 `step`。 #### 示例 - **字符串**: ```python s = "Hello World" print(s[0:5]) ``` - ...
行测考试中的数字推理部分主要考察考生对数字序列的理解和分析能力,包括等差、等比、平方、立方、质数列、合数列等多种数列形式。以下是对这部分内容的详细解读: 首先,对于自然数平方数列和立方数列,考生需要...
1. **异或加密解密**:使用异或运算进行加密解密,这是密码学中的基本技巧,异或相同的结果为0,异或不同的结果为1。 2. **日期处理**:涉及到闰年的判断,需要用到条件语句和模运算,判断年份是否能被4整除但不能...
1. 绝对值:第一题涉及到绝对值的概念,`|﹣3|` 的相反数是 `-|-3| = -3`,其倒数是 `-1/3`。 2. 调查方法:第二题涉及统计学中的调查方式,通常大型或昂贵的项目(如电视机使用寿命)会采用抽样调查,而关键部件...
1. 组合计数原理:题目中的第1题涉及到组合计数问题,员工选择出游日期的方法种数可以用组合公式计算,即从3天中选择1天,可以用C(3,1)来表示。 2. 排列与组合:第2题考察了指数运算和自然数的概念,同时隐含了排列...
- **合数数列**:包含1和本身以外至少还有一个正因数的自然数,例如4, 6, 8等。 2. **解题思路** - **基本思路**:首先尝试通过相邻项的加减、乘除或幂运算寻找规律。 - **特殊观察**:当数列项较多时,可以尝试...
这些题目涵盖了C++编程的基础和应用,包括字符串操作、逻辑判断、循环控制、数学运算、条件语句、数组处理、函数使用以及简单的算法设计。以下是这些习题涉及的知识点的详细说明: 1. **字符串加密解密**:利用异或...
J模拟题1的相关信息,我们可以从中提炼出多个计算机科学与编程相关的知识点,具体包括但不限于网络协议的基础、二进制运算、数据类型的理解、算法基础(如排序算法)、数据结构(如数组、二叉树等)的概念以及编程...
1. 异或运算加密解密:异或运算是位操作的一种,相同位相异或结果为0,不同位相异或结果为1。可以用于简单的文本加密,同一密钥解密。 2. 闰年判断:通过判断年份是否能被4整除但不能被100整除,或者能被400整除来...