当前位置: 首页 > 知识库问答 >
问题:

蛮力:查找数字[重复]

苏麒
2023-03-14

对于我的Intro CS类,我们必须创建一个程序,找到一个特定的数字,在本例中是一个地址。地址在1000和9999之间,必须满足以下标准:

  • 所有四位数字都不同
  • 千位数字是十位数字的三倍
  • 这个数字是奇数
  • 数字之和是27

到目前为止,我已经能够生成数字的范围,并缩小奇数,但其余的是相当混乱的。建议?

for (int i = 1000; i <= 9999; i++)
    {
        if (i % 2 == 1)
            System.out.print(i);
        else
            System.out.println();
    }   

共有3个答案

鲁单弓
2023-03-14

适度优化的解决方案:

/*
All four digits are different
The digit in the thousands place is three times the digit in the tens place
The number is odd
The sum of the digits is 27
*/

// Start at 4 digit numbers, only iterate odd numbers
for (int i = 1001; i <= 9999; i += 2) {

    // break the four digits into seperate variables
    int num4 = i % 10;
    int num3 = i / 10 % 10;
    int num2 = i / 100 % 10;
    int num1 = i / 1000 % 10;

    // check that the "first" number is 3x the "third"
    if (num1 != (num3 * 3))
        continue;

    // make sure all numbers are unique
    if (num1 != num2 && num1 != num3 && num1 != num4 && num2 != num3 && num2 != num4 && num3 != num4)
        // and they sum to 27
        if ((num1 + num2 + num3 + num4) == 27)
            System.out.println(i);
}

答案当然是9837

杜嘉慕
2023-03-14

首先将每个值拆分为四个单独的数字,然后应用规则:

for (int i = 1000; i <= 9999; i++)
{
    int ones = i % 10;
    int tens = (i / 10) % 10;
    int hundreds = (i / 100) % 10;
    int thousands = i / 1000;

    // rule 1
    if(ones != tens &&
            ones != hundreds &&
            ones != thousands &&
            tens != hundreds &&
            tens != thousands &&
            hundreds != thousands) {

        // rule 2
        if(thousands == 3 * tens) {

            // rule 3
            if(ones % 2 == 1) {

                // rule 4
                if(ones + tens + hundreds + thousands == 27) {

                    System.out.println(i);

                }
            }
        }
    }
}

此解决方案可以优化(例如先测试奇数),但是优化只能在解决方案有效后进行(在测量之前不应优化)。

丁阳炎
2023-03-14

我会为循环使用四个嵌套。请记住,最右边的数字的范围是1-9,最左边的3-9(因为它是3*10s),但中间对的0-9(因为数字必须是奇数并且每个数字必须是唯一的),

for (int a = 3; a < 10; a++) {
    for (int b = 0; b < 10; b++) {
        if (a == b) // unique check
            continue;
        for (int c = 1; c < 10; c++) {
            if (a == c || b == c || a != 3 * c) // unique check && # 1000s=3*10s
                continue;
            for (int d = 1; d < 10; d += 2) { // # must be odd.
                if (a == d || b == d || c == d) // unique check
                    continue;
                if (a + b + c + d == 27) { // # must sum to 27.
                    System.out.printf("%d%d%d%d%n", a, b, c, d);
                }
            }
        }
    }
}

输出是

9837

编辑通过将标识计算为,可以消除其中一个循环

    for (int a = 3; a < 10; a += 3) { // <-- a is a multiple of 3.
        for (int b = 0; b < 10; b++) {
            if (a == b) // unique check
                continue;
            int c = a / 3; // 1000s = 3*10s
            if (b == c)
                continue;
            for (int d = 1; d < 10; d += 2) { // # must be odd.
                if (a == d || b == d || c == d) // unique check
                    continue;
                if (a + b + c + d == 27) { // # must sum to 27.
                    System.out.printf("%d%d%d%d%n", a, b, c, d);
                }
            }
        }
    }

 类似资料:
  • 正如你从标题中所看到的,我正在努力对因子为2个素数的大整数进行强制因子分解。我想知道是否有一种方法可以在for循环中使用for循环。我知道这是一种很糟糕的方式,但无论如何我都愿意这样做。(我本来打算使用费马分解定理,但如果没有一些额外的方法/库,你就不能求大整数,我无法做到这一点),所以请尝试一下,看看你是否可以帮助我。大致如下: 显然,这太可怕了,我知道你不能通过说i.nextPossibleP

  • 我试图基于字母替换(没有固定偏移量)解密密码文本。我的目标是找到钥匙。 例如: 这是我的纯文本: 直到现代,密码学几乎只指加密,即将普通信息转换为无法理解的文本的过程 我生成一个随机替换,得到如下结果: 该公司的董事会成员在董事会会议上发言 规则: 纯文本只包含较低的字母a... z 空格不加密 英文文本 我想当我使用英文字母频率时,我可以用最常用的字母链接替换加密文本中最常用的字母:https:

  • 我是Python新手,刚刚开始尝试使用LeetCode来构建我的排骨。在这个经典问题上,我的代码遗漏了一个测试用例。 问题如下: 给定一个整数数组,返回两个数字的索引,使它们相加到一个特定的目标。 您可以假设每个输入都有一个精确的解决方案,并且您可以不使用相同的元素两次。 例子: 给定nums=[2,7,11,15],target=9, 因为Nums[0]Nums[1]=2 7=9,返回[0,1]

  • fn=fn−1+fn−2,其中f1=1和f2=1。因此,前12项将为f1=1,f2=1,f3=2,f4=3,f5=5,f6=8,f7=13,f8=21,f9=34,f10=55,f11=89,f12=144 第12项f12是第一个包含三位数的项。 斐波那契数列中第一个包含1000位数字的项是什么?

  • 我想出了一个蛮力算法来寻找两个给定字符串之间最长的公共子序列。它看起来时间复杂度为O(n^3)。它通过了我所有的测试用例,但我仍然不确定它是否会通过所有的测试用例......请让我知道这是正确的蛮力算法? 如果上面的代码不对,我要蛮力算法返回最长的公共子序列字符串,,我怎么才能做到这一点???

  • 问题内容: 我正在寻找一种无需重复即可生成第n个组合的算法。 我可以在哪里找到很多排列组合,但是我在哪里寻找组合。 例: Java中采用Set或List的通用递归实现会很棒。我也希望链接提供很好的解释,伪代码或示例代码。 问题答案: 您可以使用以下递归方法执行此操作: 然后,您可以使用(jDoodle)运行它: 会产生: 该程序的工作方式如下:是仍要选择的元素数,是当前的偏移值。最初,偏移值是。