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

有没有更好的迭代方法来找到均匀可除数?

燕扬
2023-03-14

我试图解决这个问题:“2520是最小的数字,可以被1到10的每个数字除,没有任何余数。

可以被1到20的所有数字整除的最小正数是多少?"

请不要告诉我答案,我真的很想自己解决。我只需要一个关于问题数学方面的建议。问题是每个周期添加一个不是一个好主意,因为这个过程太慢了。或者变量类型不长的问题?

我试图得到(1到10)和(1到17)之间所有数字的等分数,该算法运行良好。

int in_num = 1;
int score = 0;
public void calculate() {
    while (true) {
        score = 0;
        for (int x = 1; x < 21; x++) {
            if ((in_num%x) == 0) {
                score++;
            }
        }
        System.out.println("Number " + in_num + " has " + score );
        if (score == 20) {
            System.out.println(in_num);
            break;
        }
        in_num++;
    }

我期望得到特定的整数,但得到无限循环。

共有3个答案

吕志诚
2023-03-14

由于int(in_num)范围超过了其长度,因此得到了一个无限循环;将int类型替换为Long(大于int的值),您将不会得到任何无限循环,您将获得输出。

易星纬
2023-03-14

两个数字x和y的最小公倍数是xy/GCD(x,y),其中GCD计算最大公约数。

您可以使用欧几里得算法或二进制GCD算法轻松实现GCD:https://en.wikipedia.org/wiki/Greatest_common_divisor

算法如下:

result = 1;
for (x = 20; x > 0; --x)
    result *= (x/GCD(x,result));

当然,这也适用于其他数字。如果你真的不在乎,那么你可以打印232792560

薛墨一
2023-03-14

这还不够吗?

将1到20之间的每个素数相乘得到这个数!用16代替2,用9代替3。

Long number = 2 ^ 4 * 3 ^ 2 * 5 * 7 * 11 * 13 * 17 * 19L;
System.out.println(number);

详细答案:

我们需要找到每一个小于20的素数。之后,对于每个素数,我们必须计算出素数在小于20的情况下可以指数化的数。

例如,如果我们将2自身乘以四倍,它将保持在20(16)以下。但是如果我们计算2到5,它将是32,大于20。

我们将对每一个其他质数做同样的事情。通过这种计算,实际答案将是这样的:

java prettyprint-override">Long number = 2 ^ 4 * 3 ^ 2 * 5 ^ 1 * 7 ^ 1 * 11 ^ 1 * 13 ^ 1 * 17 ^ 1 * 19L ^ 1;
 类似资料: