【问题标题】:prime factorization decryption素数分解解密
【发布时间】:2018-12-15 00:32:00
【问题描述】:

我有一个程序应该将一个数字解密为素数。素数也有顺序:例如,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;
    }
}

【问题讨论】:

  • 你说的«so I can decode my wors »是什么意思?
  • 抱歉,打错字了。数字 72216017 的质数为 17、19、47、67、71。如果 2,3,5,7,11... 是 a,b,c,d,e... 这五个素数组成了 ghost 这个词。我只是不知道如何实现它。
  • 质数的顺序是如何定义的?我想订单应该会增加。我说的对吗?
  • 订单在增加。
  • 如果这里的答案对您有帮助,请接受其中之一。这对您、回答者和SO 的其他用户有很多好处。请阅读this

标签: java encryption prime-factoring


【解决方案1】:

您可以将素数存储在List 中(此列表中的素数将按升序排列)。现在您可以使用Collections.BinarySearch 来获取您想要找到相应字母表的素数索引。一旦你得到了索引(这里的索引根据你从1开始,所以a的索引是1,b的索引是2,c的索引是3等等)你可以简单地做类似char currentCharacter = (char) ('a' + primeIndex - 1) 和变量currentCharacter 将存储对应于primeIndex 的字母表。

我想建议的其他一些小事:

  1. 检查一个数是否为素数,您可以简单地检查numberToCheck 的平方根。因此,您可以将循环 for (int i = 2; i &lt;= numberToCheck / 2; i++) 替换为 for (int i = 2; i*i &lt;= numberToCheck; i++)。请注意,使用Math.sqrt 计算平方根不是一个好主意,您可以使用i*i &lt;= numberToCheck 之类的条件。
  2. 请不要随意命名您的包裹。
  3. 从 Java SE 7 开始,初始化列表时不需要显式类型参数。您可以将List&lt;Integer&gt; factors1 = new ArrayList&lt;Integer&gt;() 替换为List&lt;Integer&gt; factors1 = new ArrayList&lt;&gt;()。请阅读this 了解更多信息。
  4. 您的因子方法对我来说看起来不太好,它没有给出正确的结果。请参阅以下给出正确结果的方法:

{{

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多