以下是我正在做的问题中“奇怪数字”的属性:
1)它们具有偶数个十进制数字(没有前导零)。
2)将左半部分定义为原始数字的最重要的一半数字所代表的数字,将右半部分定义为由最不重要的一半代表的数字。右半部分可能有前导零。奇怪的数字是它的一半之和的平方:81 =(8 + 1)^ 2
以下是其他一些例子:998001 =(998 + 001)^ 2,3025 =(30 + 25)^ 2
如何编写一个程序,按递增顺序列出所有不超过18位十进制数字的奇数?
我了解如何通过查看所有可能性(2位数字,4位数字,6位数字,......,18位数字)来完成此操作,但这需要数天才能运行。有没有任何模式,所以我可以在几秒钟内输出所有奇怪的数字?我更喜欢Java中的答案,但伪代码也没问题。
答案 0 :(得分:7)
所有这些'奇怪'的数字都是完美的正方形。因此,您可以先浏览所有数字并将它们平方(直到正方形超过18位)。对于每个方格,检查它是否“奇怪”。
修改强> 我还要补充一点,这样可以加快速度的原因是它将解决方案从O(n)改为O(√n)
答案 1 :(得分:2)
除了@ spatulamania的加速,你可以使用模运算来进一步加快检查。
要检查每个完美的正方形,您必须将数字拆分为两部分,添加它们,平方和并将其与原始数字进行比较。 (我将其命名为“全面检查”)
相反,您可以先检查两个部分的最后几位(并将它们的总和平方)。例如,对于数字99980001
,取数字8
和1
,取(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;
}
}
可以尝试这种方式。这可能对您有帮助。