奇怪的数字

时间:2011-10-09 20:27:39

标签: java math

以下是我正在做的问题中“奇怪数字”的属性:

1)它们具有偶数个十进制数字(没有前导零)。

2)将左半部分定义为原始数字的最重要的一半数字所代表的数字,将右半部分定义为由最不重要的一半代表的数字。右半部分可能有前导零。奇怪的数字是它的一半之和的平方:81 =(8 + 1)^ 2

以下是其他一些例子:998001 =(998 + 001)^ 2,3025 =(30 + 25)^ 2

如何编写一个程序,按递增顺序列出所有不超过18位十进制数字的奇数?

我了解如何通过查看所有可能性(2位数字,4位数字,6位数字,......,18位数字)来完成此操作,但这需要数天才能运行。有没有任何模式,所以我可以在几秒钟内输出所有奇怪的数字?我更喜欢Java中的答案,但伪代码也没问题。

3 个答案:

答案 0 :(得分:7)

所有这些'奇怪'的数字都是完美的正方形。因此,您可以先浏览所有数字并将它们平方(直到正方形超过18位)。对于每个方格,检查它是否“奇怪”。

修改 我还要补充一点,这样可以加快速度的原因是它将解决方案从O(n)改为O(√n)

答案 1 :(得分:2)

除了@ spatulamania的加速,你可以使用模运算来进一步加快检查。

要检查每个完美的正方形,您必须将数字拆分为两部分,添加它们,平方和并将其与原始数字进行比较。 (我将其命名为“全面检查”)

相反,您可以先检查两个部分的最后几位(并将它们的总和平方)。例如,对于数字99980001,取数字81,取(8+1)^2 = 9^2 = 81的平方并测试最后一位数(在这种情况下为1) ,与99980001的最后一位相同(我将其命名为“小检查”)。如果是,则继续进行全面检查。

由于只有10x10 = 100这样的组合,这只需要做一次。您将创建一个可接受的组合数组,您可以使用:

0   0
0   1
8   1
4   4
8   4
0   5
0   6
8   6
4   9
8   9

使用这个,你只需要对大约82%的完美正方形(那些未通过小检查的那些)进行“小检查”,并且两个检查其余18%(通过小 - 检查,所以也需要“全面检查”。因此,如果“小检查”能够足够快地完成,你将获得一些速度。

您可能会发现将此表格扩展到两个部分的最后两位数字并使用它(当n足够大时)。

答案 2 :(得分:-1)

class strange_number
{
    int number(int n)
    {
        int x = n;
        String a = Integer.toString(n);
        int d = a.length();
        if(((int)(Math.pow(((x%(int)(Math.pow(10,d/2)))+(x/(int)(Math.pow(10,d/2)))),2))) == x)
        return 1;
        else
        return 0;
    }
}

可以尝试这种方式。这可能对您有帮助。