RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 706061
Accepted
V.March
V.March
Asked:2020-08-15 02:42:00 +0000 UTC2020-08-15 02:42:00 +0000 UTC 2020-08-15 02:42:00 +0000 UTC

最大回文数是两个素数五位数的乘积

  • 772

我根据一家公司的TK提出了申请。我做了一个android应用程序,在模拟器上得到了结果,似乎是正确的。但是 HR 只是取消订阅我的申请给出的答案不正确。
Aychars 是很忙的人,所以很少有人能指出错误,拒绝后被强加于人是一项非常吃力不讨好的任务。但是,我还是想至少为自己完成任务到最后。

要求是:

编写一个程序,返回最大的回文数,它是两个五位素数的乘积,并返回因子本身。
素数是只能被 1 和自身整除的自然数 (2, 3, 5, 7, 11, ...)
回文是在两个方向上读取相同的字符串(例如 ABBA)

我很清楚找到素数的原理。使用数组是不切实际的,因为必须丢弃 Eratosthenes 的筛子及其类似物——为如此多的值创建一个数组会占用大量内存。

这就是为什么我决定使用循环进行匹配和过滤。

这是我的android应用程序代码:

主要活动:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private int maxNum = 99999;
    private int minNum = 10000;

    private int divNumMax = 0;
    private int palind;

    private TextView tv1;
    private TextView tv2;
    private TextView tv3;
    private TextView tv4;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv1 = (TextView) findViewById(R.id.textView1);
        tv2 = (TextView) findViewById(R.id.textView2);
        tv3 = (TextView) findViewById(R.id.textView3);
        tv4 = (TextView) findViewById(R.id.textView4);

        Button btnStart = (Button) findViewById(R.id.button);
        btnStart.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {

        divNumMax = (int) Math.sqrt(maxNum);

        int fPM;
        int sPM;
        boolean isNotPalind;

        fPM = findMaxPrimeNumber(maxNum);
        sPM = findMaxPrimeNumber(fPM - 2);
        isNotPalind = findPalindrome(fPM, sPM);

        while (isNotPalind) {

            if (sPM <= fPM && sPM > minNum) {
                sPM = findMaxPrimeNumber(sPM - 2);
                isNotPalind = findPalindrome(fPM, sPM);

            } else if (sPM <= minNum) {
                fPM = findMaxPrimeNumber(fPM - 2);
                sPM = fPM;
            }

            tv2.setText("1-st primary number: " + fPM);
            tv3.setText("2-nd primary number: " + sPM);
            tv4.setText("1-st * 2-nd = " + palind);

        }
    }


    private int findMaxPrimeNumber(int maxNumPre) {
        int i;
        int j;
        int z;
        int maxNumNew;

        for (i = maxNumPre; i >= minNum; i = i - 2) {

            for (j = 3; j <= divNumMax; j++) {

                z = i % j;

                if (z == 0 && j <= divNumMax) {
                    break;

                } else if (z != 0 && j == divNumMax) {
                    maxNumNew = i;
                    return maxNumNew;

                }
            }

        }
        return 10000;
    }


    private boolean findPalindrome(int firstPrime, int secondPrime) {

        int resultOfMath = firstPrime * secondPrime;

        String ltrResult = Integer.toString(resultOfMath);
        String rtlResult = new StringBuffer(ltrResult).reverse().toString();

        if (ltrResult.equals(rtlResult)) {

            palind = resultOfMath;
            return false;

        } else {
            return true;
        }
    }
}

模拟器上的结果截图:

在此处输入图像描述

我在我犯了错误的地方挠头,我错过了什么。我不要求你为我做TK,但我不想留下一些未解决的问题。

android
  • 5 5 个回答
  • 10 Views

5 个回答

  • Voted
  1. Best Answer
    user176262
    2020-08-15T03:12:00Z2020-08-15T03:12:00Z

    您的整数多次环绕最大值int- 2,147,483,647。

    查看:

    99923 * 87541 = 8 747 359 343
    

    也:

    你的两个质数的乘积应该以什么数字结尾?

    • 14
  2. Andriy Martsinkevych
    2020-08-15T03:01:46Z2020-08-15T03:01:46Z

    筛子工作正常,以前在平板电脑上查找 0-10,000,000 范围内的所有素数大约需要 15 秒。最主要的是正确编写算法。

    也许我误解了你的算法(请纠正我)

    为什么第二个循环是通过增加参数来进行的,而不是从大到小?

    for (j = 3; j <= divNumMax; j++) {
    
    • 有一个细微差别:我们将考虑相同的任务,但在 0-15 的范围内,同时我们丢弃回文条件(这里它不起作用)。

      a = 13; b = 2; a*b = 26

    但是还有其他素数的乘积会产生更大的结果吗?11*13 > 26

    • 5
  3. jekiee
    2020-12-09T06:00:31Z2020-12-09T06:00:31Z

    这是这个问题的正确答案,也是在社会工作中遇到的:
    回文 - 999949999
    乘数 1 - 33211
    乘数 2 - 30109
    算法实现如下:
    寻找最大回文的方法(输入是素数列表)

    static void palindrome(ArrayList<Integer> primeNumbers) {
        long palindrome = 0;
        long multiplier1 = 0;
        long multiplier2 = 0;
        for (int j = 0; j < primeNumbers.size(); j++) {
            for (int k = 0; k < primeNumbers.size(); k++) {
                long i = (long) primeNumbers.get(j) * (long) primeNumbers.get(k);
                if (palindromeCheck(i)) {
                    if (i > palindrome) {
                        palindrome = i;
                        multiplier1 = primeNumbers.get(j);
                        multiplier2 = primeNumbers.get(k);
                    }
                }
            }
        }
        System.out.println("palindrome = " + palindrome
                + "\nmultiplier1 = " + multiplier1
                + "\nmultiplier2 = " + multiplier2);
    }  
    

    搜索素数的方法(在输入处,正在检查的数字范围内的最大值和最小值):

    static ArrayList eratosthenesPrimeNumbers(int max, int min) {
        ArrayList<Integer> primeNumbers = new ArrayList<>();
        boolean[] array = new boolean[max];
    
        for (int i = 2; Math.pow(i, 2) <= max; i++) {
            if (!array[i]) {
                for (int j = (int) Math.pow(i, 2); j < max; j += i) {
                    array[j] = true;
                }
            }
        }
        for (int i = max - 1; i >= min; i--) {
            if (!array[i]) {
                primeNumbers.add(i);
            }
        }
        return primeNumbers;
    }  
    

    检查找到的数字是否是回文(输入时检查的数字):

    static boolean palindromeCheck(long i) {
        char[] palindrome = String.valueOf(i).toCharArray();
        int fromBegin = 0;
        int fromEnd = palindrome.length - 1;
        while (fromBegin < fromEnd) {
            if (palindrome[fromBegin] == palindrome[fromEnd]) {
                fromBegin++;
                fromEnd--;
            } else return false;
        }
        return true;
    }
    

    而且我也忘了写应该调用这些方法:)
    我是这样做的:

    public class Main {
    static final int MAX_MULTIPLIER = 99999;
    static final int MIN_MULTIPLIER = 10000;
    
    public static void main(String[] args) {
    
        ArrayList<Integer> primeNumbers2 = new ArrayList<>(eratosthenesPrimeNumbers(MAX_MULTIPLIER, MIN_MULTIPLIER));
        palindrome(primeNumbers2);
    }
    

    以及方法的进一步实施......

    • 4
  4. Sergey
    2020-09-26T22:54:55Z2020-09-26T22:54:55Z

    稍微了解一下算法。在我看来,这里已经不能正常工作了:

     while (isNotPalind) {
    
                if (sPM <= fPM && sPM > minNum) {
                    sPM = findMaxPrimeNumber(sPM - 2);
                    isNotPalind = findPalindrome(fPM, sPM);
    
                } else if (sPM <= minNum) {
                    fPM = findMaxPrimeNumber(fPM - 2);
                    sPM = fPM;
                }
    
    
            }
    

    事实证明,您将打印遇到的第一个回文,但不能保证它会是最大值。

    让我们举一个抽象的例子,运行所有数字的 10 到 1 个可能的乘积。

    根据您的算法,我们绕过第一个圆圈:

    10*10, 10*9 , 10*8, 10*7....<- 并立即显示遇到的第一个回文

    然后是第二轮:

    9*9, 9*8, 9*7...<- 或者在这里我们立即显示遇到的第一个回文

    然后是第三个:

    8*8, 8*7, 8*6...
    

    等等...

    假设在第一轮 10 * 2 是回文(假设!)

    也让我们在第二轮说 9 * 8 - 这也是一个回文(假设!)

    但是你的程序会输出 10*2(即使 9*8 大于 10*2)

    也就是说,遇到的第一个不是一个选项。如果我错了,希望作者理解我并纠正我。

    • 2
  5. Sergey Lontkovskiy
    2020-09-30T00:35:20Z2020-09-30T00:35:20Z

    问题的条件暗示了两个简单的五位数的乘积。该算法适用于两位、三位、四位数字。但直接拒绝为 5 工作。这里有什么错误?

    public class Palindrome {
        private static final boolean reverse(long value) {
            String str = String.valueOf(value);
            return str.equals(new StringBuilder(str).reverse().toString());
        }
    
        private static final boolean isPrime(int n) {
            int i;
            for (i = 2; i <= n / 2; i++) {
                if (n % i == 0) {
                    return false;
                }
            }
            return true;
        }
    
    
        public static void main(String[] args) {
    
            int i = 0;
            int maxPrimeNumber = 99971;
            int minPrimeNumber = 10007;
    
            outer:
            for (i = maxPrimeNumber; i >= minPrimeNumber; i--) {
                for (int j = maxPrimeNumber; j >= minPrimeNumber; j--) {
    
                    if (isPrime(i) && isPrime(j)) {
                        long product = j * i;
                        if (reverse(product)) {
                            System.out.printf("%d * %d = %d%n", i, j, product);
                            break outer;
                        }
                    }
                }
            }
        }
    }
    
    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5