我的一位同事向他的C编程课提出了以下问题,我发现这很有趣。可以很容易地用任何编程语言完成,我立刻想到了Wolfram。 问题是这样的:
数字25是一个唯一的完美正方形,如果我们将每个数字加1,则它变成36,这也是一个完美的正方形! 编写程序以查找另一组具有相同品质的数字。
我确信这可以在mathematica中轻松完成。 有人可以解释我如何在mathematica中做到这一点。请注意,问题的原因只是让我进入不了解数学的Mathematica编程的借口。
感谢所有人。
答案 0 :(得分:2)
功能更强大的解决方案。
Table[x^2, {x, 1, 100}] // Select[IntegerQ[Sqrt[FromDigits[IntegerDigits[#] + 1]]] &]
数字9应该如何处理?
IntegerDigits[19]
(* {1, 9} *)
IntegerDigits[19] + 1
(* {2, 10} *)
FromDigits[IntegerDigits[19] + 1]
(* 30 *)
+1是否携带,所以结果数是20而不是30?
答案 1 :(得分:2)
您可以轻松地将其扩展到任何基数,而您只需要知道数字在给定基数中的长度即可。我的意思是以下内容。假设以10为底,数字为25。要检查前提,我们需要加11。但是11仅仅是:
object = [
{
table: [
{
category: 'Dev thing',
capability: 'Data Access',
adopt: 'Spring Data',
trial: '',
assess: '',
hold: ''
},
{
category: 'Dev thing',
capability: 'Data Access',
adopt: 'Spring Data',
trial: '',
assess: '',
hold: ''
},
{
category: 'Dev thing',
capability: 'Data Access',
adopt: 'Spring Data',
trial: '',
assess: '',
hold: ''
},
],
showindex: 1
},
{
table: [
{
category: 'Dev thing',
capability: 'Data Access',
adopt: 'Spring Data',
trial: 'stuff',
assess: 'stuff',
hold: 'stuff'
},
{
category: 'Dev thing',
capability: 'Data Access',
adopt: 'Spring Data',
trial: '',
assess: '',
hold: ''
},
{
category: 'Dev thing',
capability: 'Data Access',
adopt: 'Spring Data',
trial: '',
assess: '',
hold: ''
},
],
showindex: 1
}
];
现在想象数字 72×72 = 5184 ,但以3为底的数字( 5184 10 = 21010000 3 )。现在以3为基础进行计算,您将得到
25 + 11
= 25 + 10^1 + 10^0
= 25 + (10^2-1)/(10-1)
= 36 = 6^2
其中 102121111 3 = 8464 10 = 92 10 ×92 10
您注意到,您要做的就是将数字(b n -1)/(b-1)添加到数字中,然后检查是否为一个正方形。这里的 n 表示以 b 为底的数字 x 的总位数。
通过一个简单的查找表,您可以在Mathematica中执行以下操作:
21010000 + 11111111
= 21010000 + 3^7 + 3^6 + 3^5 + 3^4 + 3^3 + 3^2 + 3^1 + 3^0
= 21010000 + (3^8-1)/(3-1)
= 102121111 = 10102^2
然后以2为底的完整列表会以10为底:
b = 10
x = Table[n^2, {n, 1, 1000}];
Select[x, MemberQ[x, # + (b^IntegerLength[#, b] - 1)/(b - 1)] &];
{25, 289, 2025, 13225, 100489, 198025, 319225, 466489}
答案 2 :(得分:1)
让您不必先将自己扔入大海,而是先在游泳池的浅水区划一圈。
n=1;
While[n<100,
d=IntegerDigits[n];(*get the list of digits making up n*)
newd=d+1;(*add one to every element of the list giving a new list*)
newn=FromDigits[newd];(*turn that new list of digits back into a number*)
If[IntegerQ[Sqrt[newn]],Print[{n,newn}]];
n++
]
这不仅可以查看n的平方值,还可以为您提供有关如何递增数字并测试平方结果的提示。
在Mathematica中,至少总是有十二种不同的方式来做任何事情,并且某些文化围绕着使程序尽可能短,并且可能尽可能地含糊不清。您可以稍后再开始整理。开始使用新语言时,简单性似乎更好。
我希望你玩得开心。
答案 3 :(得分:1)
find[from_, to_] := Module[{a, b, c, d, e},
a = Range[from, to];
b = a^2;
c = IntegerDigits[b];
(*Add 1's to the digits of the square,
except where the square contains a 9*)
d = MapThread[
If[MemberQ[#2, 9], Null,
#1 + FromDigits[ConstantArray[1, Length[#2]]]] &,
{b, c}];
(*Find the positions where the square roots are integers*)
e = Position[Sqrt[d], _?IntegerQ, {1}];
Extract[a, e]]
find[1, 1000000]
{5,45,115,2205,245795,455645}
例如
Sqrt[45^2 + 1111]
56
和
Sqrt[455645^2 + 111111111111]
564556