P1017 [NOIP2000 提高组] 进制转换
首先要明白进制转换从低位到高位的思想是确定基数然后递归算出想要的数。
有一个比较显然的思路就是从高位到低位算,这样能保证数的绝对值每次都减小。
来看看关于负数的运算:乘除看负号奇偶性,负负得正;而模的定义就是被除数减去除数乘整除的积!
正数模负数等于非负数,负数模正数等于非正数,负数模负数等于非正数,因为只看被除数符号嘛。
仔细想想也非常有道理,除数乘整除的积的绝对值小于等于被除数的绝对值,而不考虑 \(0\) 两者符号相同。
所以能不能像正进制一样优先确定低位呢?答案是肯定的。
每次除进制数之后,符号会改变。如果余数小于 \(0\) 了,需要向高位借一位(可以看出这种情况只会出现在被除数是负数的情况下)。
借一位之后会导致结果加一(正的变多了,负的同样要变多)。
但因为进制的绝对值大于等于 \(2\),所以肯定能表示出来。
当然不从实现的角度来也是可以分析得出的,假设是 \(-R(R>1)\) 进制数,最低位基数为 \(R^0=1\),可以表示出 \([0,R-1]\) 这些数字,值域大小为 \(R^1\)。
考虑加入新的最高位 \(i\),不妨设当前可表示出的值域为 \([A,B]\),值域大小为 \(C\):
- \(i\bmod 2=1\)。\(i\) 位的基数是 \(-R^{i-1}\),这一位取 \(0\sim R-1\),值域拓展到 \([A-R^{i-1}\times(R-1),B]\) 的条件是 \(C\geq R^{i-1}\times(R-1)\),如果成功拓展那么值域大小将增大到 \(C+R^{i-1}\times(R-1)\)。
- \(i\bmod 2=0\)。\(i\) 位的基数是 \(R^{i-1}\),这一位取 \(0\sim R-1\),值域拓展到 \([A,B+R^{i-1}\times(R-1)]\) 的条件是 \(C\geq R^{i-1}\times(R-1)\),如果成功拓展那么值域大小将增大到 \(C+R^{i-1}\times(R-1)\)。
观察到 \(C=R^{i-1}\),所以始终能恰好表示出范围内的数。而左右端点是不断拓展的,所以可以唯一表示出所有整数。