找一个幸运的号码

时间:2017-01-25 09:25:31

标签: algorithm equation-solving

我试图解决黑客排名超过here的问题。

问题是:

enter image description here

所以为了解决这个问题,我尝试了一个简单的数学方程式:

4x + 7y = lucky_number

例如,要检查15是否为lucky_number,我可以从xy0开始,并在上面替换等式直到等于或大于(如果是这样停止并说它不是幸运数字)

以上逻辑运行正常。但问题是数字很大,想象一下,从966888032206353开始x,y开始0是不是一个有效的想法。

对它的任何指导?

4 个答案:

答案 0 :(得分:1)

另一种思考方式:您需要做的就是绘制线

7y = -4x + 966888032206353

并识别x和y都是整数的任何点。

所以,你不需要嵌套循环。代替:

  1. 将y迭代为整数。 for y=0; y<966888032206353 / 7; y++

  2. 对于每次迭代,使用浮点数学求解x。

  3. 如果x是整数,则数字很幸运。

  4. 这将需要大约138T的迭代次数。

答案 1 :(得分:1)

从7 * 4 = 28起的所有数字(实际上甚至是18岁以上的所有数字)都很幸运,其余的只是预先计算一个小桌子。

答案 2 :(得分:1)

这是我提交给Hackerrank的代码。

#include <bits/stdc++.h>
using namespace std;
int q; long long n; bool dp[1009];
int main() {
    cin >> q;
    dp[0] = true;
    for(int i = 1; i <= 1000; i++) {
        if(i >= 4 && dp[i - 4]) dp[i] = true;
        if(i >= 7 && dp[i - 7]) dp[i] = true;
    }
    while(q--) {
        cin >> n;
        if(n >= 1000 || dp[n]) cout << "Yes" << endl;
        else cout << "No" << endl;
    }
}

这是动态编程,但如果n >= 28它总是正常的。

答案 3 :(得分:0)

您的一个问题是您的问题描述非常不完整。如果您只允许负4x + 7yx,则可以将任意整数表示为y。例如,1 = 4*2 + (-1)*7您可以通过乘以该因子获得任何数字的解决方案。

我认为从算法角度来看,最好的解决方案是使用动态编程。您可以简单地开始检查数字是否在您意义上是幸运的。一旦你找到4个连续的幸运数字,你就可以停下来,因为之后的任何数字都会很幸运,只需加上4个适当的次数即可。我猜你很早就会发现一系列4个连续的幸运数字。