首页 > 解决方案 > 确定一个数字是否由两个其他数字相乘的和组成的算法

问题描述

假设它是2k+2+3p=n作为测试给出的,如何找出测试对于一个数字是正确的,对于一个数字是有效的,当k>=0, p>=0, n>=0

示例 1:n=24 应为真,因为 k=5 & p=4 => 2(5)+2+3(4)=24

示例 2:n=11 应该结果为真,因为 k=0 & p=3 => 2(0)+2+3(3)=11

示例 3:n=15 应为真,因为 k=5 & p=1 => 2(5)+2+3(1)=15

我想知道是否有一个数学解决方案。我像下面这样解决了它:

//let say 2k+2+3p=n
var accepted = false;
var betterNumber= n-2;
//assume p=0
var kReminder= (betterNumber)%2==0;
//assume k=0
var pReminder= (betterNumber)%3==0;

if (kReminder || pReminder){
    accepted=true;
}else{
    
    var biggerChunk= Math.Max(2,3); //max of 2k or 3p, here i try to find the bigger chunk of the 
    var smallerChunk= Math.Min(2,3);

    if ((betterNumber%bigger)%smallerChunk==0){
        accepted=true;
    }else
    {
        accepted=false;
    }    
}

仍然有我没有看到的边缘情况。所以我想知道它是否有更好的解决方案。

更新

上面的测试只是一个例子。该解决方案对于大数字或任何数字组合应该足够有效1000000k+37383993+37326328393p=747437446239902

标签: javascriptalgorithmmath

解决方案


通过检查,2 是最小的有效偶数,5 是最小的有效奇数:

2 is valid (k=0, p=0)
5 is valid (k=0, p=1)

All even numbers >= 2 and all odd numbers >= 5 are valid.
Even numbers: k=n/2-1, p=0
odd numbers: k=(n-3)/2-1, p=1

我们在这里所做的是增加 k 以将 2s 添加到最小的有效偶数和奇数,以获得所有更大的偶数和奇数。

n >= 2 的所有值都有效,但 3 除外。


推荐阅读