新的计数序列(内测第1届第2题)
题目要求
问题描述:自从过完双11,小明就对数字1产生了厌恶,于是他决定今后计数时,凡是带有1的数字都跳过。比如正常的计数序列是1,2,3,4,5,6,7,8,9,10,11...而小明对应的计数序列为2,3,4,5,6,7,8,9,20,22,23...。请写一个程序,帮小明计算一个正常计数序列中的数在他自己的计数序列中应该是多少?
样例输入1:正常计数中的次序:1
样例输出1:小明计数中的次序:2
样例输入2:正常计数中的次序:9
样例输出2:小明计数中的次序:20
样例输入3:正常计数中的次序:11
样例输出3:小明计数中的次序:23
解决方案
如下图,观察小明的计数序列:
由观察可以看出,此序列每过九个数字循环一次,可以看错是逢九进"一"。所以,进一步可以联想到,这个序列不过是一个“变异”的九进制序列,只不过用新符号023456789取代了正常九进制序列中的012345678。由此可以想到,解题办法就是先按正常的九进制转换将一个正常的计数数字转换为九进制,然后再替换为此“变异”的九进制序列中所用的符号。
到这儿应该理解,数字并不一定是数字本身,它仅仅是个符号,可以在人为的规定下,改变它所代表的含义。
源码示例 & 结果展示
小结
还有一种解法是每遇到一个数,就判断其中是否包含1,如果包含1,则舍弃,不算入计数序列。这样写的缺点是程序运行的时间复杂度会很大。
理解数字只是个符号,不要看到1就想到1,如果愿意,完全可以将1表示为任何数。