MATLAB社区

MATLAB、社区和更多

双你的快乐,乐趣和变化的数字

你今天一个游客博客治疗。但首先…

什么是1947年和7194年之间的关系号码?仔细观察,你会发现它们是相同的,除了数字7已经从后面到前面。

一个小文本在数字空间变化有很大影响。MATLAB中央英雄约翰D 'Errico说到这种关系在他下面的帖子。但是在我们到达之前,我想做一些评论。首先是感谢约翰送我这篇文章!他送我一个生活的脚本(与后缀MLX MATLAB文件类型),转换到一个WordPress的博客。导致我第二个评论:你怎么喜欢客座博客在这个网站吗?如果你有一个脚本在一个有趣的话题和生活你想发布它,发送给我(gulley@mathworks.com)。我们可以一起工作,谁知道呢?你可能会得到一个署名MATLAB中央。

现在为你治疗。看约翰为他解决了一个残忍的问题灵活的中风。虽然我将问你,一旦你理解了问题陈述,尝试解决它自己之前结束。我打赌你不会和约翰。不管怎样,我不能…

双你的快乐

通过约翰D 'Errico

当最后一位正整数双打(因此个位数)成为第一个移动或最高位数字?假设一个十进制数字表示。事实上,这是一个众所周知的问题。例如,您可以找到它讨论了在YouTube上

带来的问题也有趣当二进制。在二进制有解决方案吗?存在一个二进制数,也许10101011101,这样,如果我们转变单位数量的左端,这一数字将完全双吗?

唉,我们可以证明这种解决方案永远存在,至少,不是以二进制。证明很简单。想象一个解决方案确实存在,由N个二进制位组成的。我们所描述的转变并不增加数量的比特数。它仅仅是一个纯粹的换位现有的碎片。

然而,当你当任何二进制数乘以2吗?只要数量是零,那么如果你乘以2,你总数量的比特数增加1。因此我们的目标是不可能的二进制数。这有可能发生如果写在基地数量3或以上。我们可以调查这种可能性之后,但以10为底的第一这是如何工作的呢?

回基地,我们假定一些小数存在这样一个循环移动最低的订单现在单位的小数位数的地方成为最高的数字,然后将数字的两倍。再一次,这并不改变数量的小数位数。

我们可以尝试一些简单的例子,看看它如何工作。例如,考虑数量102。转换将我们创建的新号码210,由最低订单的2位移动,到最高的数字。然而,这并不数量的两倍。

2 * 102 ~ = 210
ans =逻辑1

或许我们可以试一试其他的数字,12345年,但这一数字翻倍不会产生51234。事实上,我断言,蛮力解决这个问题需要一些努力。我们需要用数学来解决我们的问题。

我们的目标是找到一个十进制数的形式

的表情,y是一个一位数整数x任意秩序的一个整数。结合,他们必须满足的关系:

在这种关系,P是n数量的小数位数只是作为一个转变为个位数P左边的地方。等我们需要寻找最小的解决方案,如果确实存在多个解决方案。金宝搏官方网站

一个重要的问题是如果个位数可以是0吗?如果y为0 ?然后控制方程减少到相当简单

解决x = = 0。所以唯一可能解决我们的问题,如果问题数量为零个位数是非常无聊的N = = 0。因为我们已经要求必须一个正整数N,这种情况下是不可能的。因此y必须来自一组[1:9]。与一些额外的努力,我们也许能够更完整,但一是一个好的开始。现在回到这个问题的控制方程,现在孤立x和y的两侧平等。

如果这个方程中的变量是整数,则算术基本定理告诉我们,19(作为一个质数)必须把y,或必须划分。然而,我们只是说y必须来自一组1:9。我们现在可以得出结论19必须划分

因此,什么是最小的功率P,这样19分10 ^ P 2 ?(注意:下面的信谊命令使用的符号数学工具箱)

P =找到(mod(信谊(10)。^ (1:10 0)- 2,19)= = 0)
P = 17 35 53 71 89
差异(P)
ans = 18 18 18 18

这是有用的。尽可能最小的功率P这样19为整数因子是17。似乎每18权力之后的10点也有相同的属性,但是我们将首先感兴趣的情况P = 17,如果存在一个最小的解决方案,它可能有18个小数位数。我建议之前,蛮力将是一个困难的方式来解决这个问题。

至少,如果解决方案确实存在,我们可以使用也许int64做计算。双精度我们会失败,因为双打敲打出16个小数位数,之前你可以不再代表一个整数。然而,空间存在于int64以来

intmax (“int64”)
ans =int649223372036854775807

这是一个数量与19小数位数。uint64将允许我们将略高,但int64是完全足够了。

现在,假设我们有一个从一组1:9个位数呢?

unitsdigit = int64 (1:9)”;P = int64 (17);

现在我们有足够的信息可能解出x。

x = (int64 (10) ^ P - 2) * unitsdigit / int64 (19);N = 10 * x + unitsdigit
N =9×1 int64列向量52631578947368421 105263157894736842 157894736842105263 210526315789473684 263157894736842105 210526315789473684 157894736842105263 105263157894736842 52631578947368421

这些都是潜在的x值。我们可以看到如果他们工作。也就是说,如果我们双N,那么我们必须有相同的结果,现在如果我们转置个位数成为最高的数字。

(2 * N, P * 10 ^ unitsdigit + x)
ans =9×2 int64矩阵105263157894736842 105263157894736842 210526315789473684 210526315789473684 315789473684210526 210526315789473684 210526315789473684 105263157894736842 105263157894736842 526315789473684210 631578947368421052 631578947368421052 736842105263157894 736842105263157894 736842105263157894 631578947368421052 631578947368421052 526315789473684210

第一种情况下,y = = 1,测试失败,因为我们看到了一个额外的0插入第二最高阶位。然而,这让第二种情况下,x = = 2,最小的解决方案。这一定是最小的数所需的属性。

N (2)
ans =int64105263157894736842
2 * (10 * x (2) + unitsdigit (2)) = = 10 ^ P * unitsdigit (2) + x (2)
ans =逻辑1

有8其他解决方案发现,所有这些都是有效金宝搏官方网站的,除非他们不是最小的。超越了这一点,接下来的解决方案有36个小数位数,远远超出甚至uint64的极限。

再次,小心,因为这些计算在双精度运算就失败了。

|
  • 打印

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。