一道没溜儿的数学题
前天的时候有读者问笔者这样一个问题:
一个自然数的个位是六,如果把个位上的六移动到原自然数的最高位,那么新构成的自然数是原来这个数的三倍。问原来的自然数有多少位。
这位热心的读者告诉笔者,他想用穷举法然后使用C语言来解决这个问题。笔者认为这么做肯定不行,因为在C语言里精度极高的数据类型double虽然可以表示三百零八位的浮点数,但是它的有效位数只有十五位。解决这类问题显然是不够的。我们应该通过数学的方法来解决这个问题。
想想看,新构成的自然数是原自然数的三倍,对于这个自然数的任意一位来说最小是零,最大是九,就是说某一位乘以三结果最小是零,最大是27。这给了我们一个信息,每次做乘法之后只影响新构成的自然数中的某两位,其中一位由影响的是本次计算的位,另一位影响的是下次计算的位,这样我们只需要两个必须变量表示当前位和当前位的下一位和一个额外的变量充当计数器就可以解决这个问题了。当当前位等于六,下一位等于零的时候。我们就可以停止运算了。
你也可以在纸上进行推算来得出结果,笔者可以告诉你答案是原本的自然数有二十八位。
如果你懂C语言,你可以试着阅读下面的程序:
后来昨天的时候笔者又琢磨出来一种新的解法,这种解法有一难以理解,不过没关系我们有程序帮忙。既然这个数可以从个位慢慢乘上去,那么它必然可以从最后的结果慢慢除回来。新构成的自然数的首位是六,那么就意味着它除以三之后的首位应该是二,也就是说原自然数的首位是二。那么原自然数的次首位应该是零因为二除以三商零余二,它的首位的二肯定是来源于进位。这样只需要把当前受影响的位的商计算出来,并且计算出来它所有的进位就可以慢慢推导出这个数了。
那么应该到什么时候停止呢?直到商是六,所有的进位都变成零的时候就可以停止了。同样你也可以在纸上推演,或者是通过编程来得出来它一共有多少位。结果当然和昨天一样是二十八位。
如果你懂C语言的话,就应该能够看懂下面的程序:
如果你喜欢笔者的文章,你可以关注笔者的微信公众号:yevgeny_liu
如果你想要转载这篇文章,请注明出自刘祺的公众号:yevgeny_liu
原文转载自异步社区
原文链接:https://www.epubit.com/articleDetails?id=NC7E3EF9111C00001CDFF19C01C845D50
- 点赞
- 收藏
- 关注作者
评论(0)