zoukankan      html  css  js  c++  java
  • P1017 [NOIP2000 提高组] 进制转换

    首先要明白进制转换从低位到高位的思想是确定基数然后递归算出想要的数。

    有一个比较显然的思路就是从高位到低位算,这样能保证数的绝对值每次都减小。

    来看看关于负数的运算:乘除看负号奇偶性,负负得正;而模的定义就是被除数减去除数乘整除的积!

    正数模负数等于非负数,负数模正数等于非正数,负数模负数等于非正数,因为只看被除数符号嘛。

    仔细想想也非常有道理,除数乘整除的积的绝对值小于等于被除数的绝对值,而不考虑 (0) 两者符号相同。

    所以能不能像正进制一样优先确定低位呢?答案是肯定的。

    每次除进制数之后,符号会改变。如果余数小于 (0) 了,需要向高位借一位(可以看出这种情况只会出现在被除数是负数的情况下)。

    借一位之后会导致结果加一(正的变多了,负的同样要变多)。

    但因为进制的绝对值大于等于 (2),所以肯定能表示出来。

    当然不从实现的角度来也是可以分析得出的,假设是 (-R(R>1)) 进制数,最低位基数为 (R^0=1),可以表示出 ([0,R-1]) 这些数字,值域大小为 (R^1)

    考虑加入新的最高位 (i),不妨设当前可表示出的值域为 ([A,B]),值域大小为 (C)

    • (imod 2=1)(i) 位的基数是 (-R^{i-1}),这一位取 (0sim R-1),值域拓展到 ([A-R^{i-1} imes(R-1),B]) 的条件是 (Cgeq R^{i-1} imes(R-1)),如果成功拓展那么值域大小将增大到 (C+R^{i-1} imes(R-1))
    • (imod 2=0)(i) 位的基数是 (R^{i-1}),这一位取 (0sim R-1),值域拓展到 ([A,B+R^{i-1} imes(R-1)]) 的条件是 (Cgeq R^{i-1} imes(R-1)),如果成功拓展那么值域大小将增大到 (C+R^{i-1} imes(R-1))

    观察到 (C=R^{i-1}),所以始终能恰好表示出范围内的数。而左右端点是不断拓展的,所以可以唯一表示出所有整数

  • 相关阅读:
    贝叶斯公式的直观理解(先验概率/后验概率)
    linux生成.so库如何指定添加其他的.so库
    第一章笔记
    高学成
    第一张笔记
    简单编译器之语法分析
    浅析Netty的异步事件驱动(二)
    浅析Netty的异步事件驱动(一)
    简单编译器之词法分析
    Android TV 焦点控制逻辑
  • 原文地址:https://www.cnblogs.com/May-2nd/p/14742897.html
Copyright © 2011-2022 走看看