质因数分解解密
prime factorization decryption
我有一个程序可以将一个数字解密成它的素数。素数也有顺序:例如,2 是第一个素数,3 是第二个,5 是第三个,依此类推。索引是 1 代表 a,2 代表 b,3 代表 c,依此类推。我不知道如何比较两个数组列表以便为每个素数分配一个索引,这样我就可以解码一个用数字 72216017 加密的单词。数字 72216017 有素数 17,19,47,67,71 .如果2,3,5,7,11...是a,b,c,d,e...这五个质数组成了ghost这个词,我只是不知道如何分配和排序这些数字他们的指数。
package name;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class PrimeFactorsEffective {
private static int z;
private int w = z;
public static List<Integer> primeFactors(int numbers) {
int n = numbers;
List<Integer> factors = new ArrayList<Integer>();
for (int i = 2; i <= n / i; i++) {
while (n % i == 0) {
factors.add(i);
n /= i;
}
if (n > 1) {
factors.add(n);
System.out.println(factors);
z = Collections.max(factors);
}
}
return factors;
}
public static void main(String[] args) {
System.out.println("Primefactors of 72216017");
for (Integer integer : primeFactors(72216017)) {
System.out.println(integer);
}
List<Integer> factors1 = new ArrayList<Integer>();
List<String> index1 = new ArrayList<String>();
int i;
int element = 0;
int num = 0;
int maxCheck = z; // maxCheck limit till which you want to find prime numbers
boolean isPrime = true;
String primeNumbersFound = "";
//Start loop 1 to maxCheck
for (i = 1; i <= maxCheck; i++) {
isPrime = CheckPrime(i);
if (isPrime) {
primeNumbersFound = primeNumbersFound + i + " ";
factors1.add(i);
factors1.get(num);
}
}
System.out.println("Prime numbers from 1 to " + maxCheck + " are:");
System.out.println(factors1);
}
public static boolean CheckPrime(int numberToCheck) {
int remainder;
for (int i = 2; i <= numberToCheck / 2; i++) {
remainder = numberToCheck % i;
if (remainder == 0) {
return false;
}
}
return true;
}
}
您可以将质数存储在 List
中(此列表中的质数将按升序排列)。现在您可以使用 Collections.BinarySearch
来获取您要为其查找相应字母表的素数的索引。一旦你得到了索引(这里的索引根据你从 1 开始,所以 a
的索引是 1,b
的索引是 2,c
的索引是 3 等等on) 你可以简单地做一些像 char currentCharacter = (char) ('a' + primeIndex - 1)
这样的事情,变量 currentCharacter
将存储对应于 primeIndex
.
的字母表
我想建议的其他一些小事情:
- 检查一个数是否为质数,您可以简单地检查
numberToCheck
的平方根。因此,您可以将循环 for (int i = 2; i <= numberToCheck / 2; i++)
替换为 for (int i = 2; i*i <= numberToCheck; i++)
。请注意,使用 Math.sqrt
计算平方根不是一个好主意,您可以使用 i*i <= numberToCheck
. 这样的条件
- 请不要随意命名您的包。
- 从 Java 开始,SE 7 不需要在初始化列表时使用显式类型参数。您可以将
List<Integer> factors1 = new ArrayList<Integer>()
替换为 List<Integer> factors1 = new ArrayList<>()
。请阅读 this 了解更多信息。
- 你的因子方法对我来说不太好,它没有给出正确的结果。请参阅以下给出正确结果的方法:
{{
public static List<Integer> primeFactors(int numbers) {
int n = numbers;
List<Integer> factors = new ArrayList<>();
for (int i = 2; n>1; i++) {
while (n % i == 0) {
factors.add(i);
n /= i;
}
}
z = Collections.max(factors);
return factors;
}
我有一个程序可以将一个数字解密成它的素数。素数也有顺序:例如,2 是第一个素数,3 是第二个,5 是第三个,依此类推。索引是 1 代表 a,2 代表 b,3 代表 c,依此类推。我不知道如何比较两个数组列表以便为每个素数分配一个索引,这样我就可以解码一个用数字 72216017 加密的单词。数字 72216017 有素数 17,19,47,67,71 .如果2,3,5,7,11...是a,b,c,d,e...这五个质数组成了ghost这个词,我只是不知道如何分配和排序这些数字他们的指数。
package name;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class PrimeFactorsEffective {
private static int z;
private int w = z;
public static List<Integer> primeFactors(int numbers) {
int n = numbers;
List<Integer> factors = new ArrayList<Integer>();
for (int i = 2; i <= n / i; i++) {
while (n % i == 0) {
factors.add(i);
n /= i;
}
if (n > 1) {
factors.add(n);
System.out.println(factors);
z = Collections.max(factors);
}
}
return factors;
}
public static void main(String[] args) {
System.out.println("Primefactors of 72216017");
for (Integer integer : primeFactors(72216017)) {
System.out.println(integer);
}
List<Integer> factors1 = new ArrayList<Integer>();
List<String> index1 = new ArrayList<String>();
int i;
int element = 0;
int num = 0;
int maxCheck = z; // maxCheck limit till which you want to find prime numbers
boolean isPrime = true;
String primeNumbersFound = "";
//Start loop 1 to maxCheck
for (i = 1; i <= maxCheck; i++) {
isPrime = CheckPrime(i);
if (isPrime) {
primeNumbersFound = primeNumbersFound + i + " ";
factors1.add(i);
factors1.get(num);
}
}
System.out.println("Prime numbers from 1 to " + maxCheck + " are:");
System.out.println(factors1);
}
public static boolean CheckPrime(int numberToCheck) {
int remainder;
for (int i = 2; i <= numberToCheck / 2; i++) {
remainder = numberToCheck % i;
if (remainder == 0) {
return false;
}
}
return true;
}
}
您可以将质数存储在 List
中(此列表中的质数将按升序排列)。现在您可以使用 Collections.BinarySearch
来获取您要为其查找相应字母表的素数的索引。一旦你得到了索引(这里的索引根据你从 1 开始,所以 a
的索引是 1,b
的索引是 2,c
的索引是 3 等等on) 你可以简单地做一些像 char currentCharacter = (char) ('a' + primeIndex - 1)
这样的事情,变量 currentCharacter
将存储对应于 primeIndex
.
我想建议的其他一些小事情:
- 检查一个数是否为质数,您可以简单地检查
numberToCheck
的平方根。因此,您可以将循环for (int i = 2; i <= numberToCheck / 2; i++)
替换为for (int i = 2; i*i <= numberToCheck; i++)
。请注意,使用Math.sqrt
计算平方根不是一个好主意,您可以使用i*i <= numberToCheck
. 这样的条件
- 请不要随意命名您的包。
- 从 Java 开始,SE 7 不需要在初始化列表时使用显式类型参数。您可以将
List<Integer> factors1 = new ArrayList<Integer>()
替换为List<Integer> factors1 = new ArrayList<>()
。请阅读 this 了解更多信息。 - 你的因子方法对我来说不太好,它没有给出正确的结果。请参阅以下给出正确结果的方法:
{{
public static List<Integer> primeFactors(int numbers) {
int n = numbers;
List<Integer> factors = new ArrayList<>();
for (int i = 2; n>1; i++) {
while (n % i == 0) {
factors.add(i);
n /= i;
}
}
z = Collections.max(factors);
return factors;
}