代码之家  ›  专栏  ›  技术社区  ›  Dogbert

修改整数一位数的最快方法

  •  0
  • Dogbert  · 技术社区  · 14 年前

    假设我有一个 int x = 54897

    例子

    x = 54897
    index = 3
    value = 2
    y = f(x, index, value) // => 54827
    

    编辑:我所说的最快,绝对是指更快的性能。没有字符串处理。

    5 回复  |  直到 14 年前
        1
  •  3
  •   ruslik    14 年前

    在最简单的情况下(考虑到数字从LSB到MSB进行编号,第一个数字是0)并且知道旧的数字,我们可以这样做:

    num += (new_digit - old_digit) * 10**pos;
    

    对于真正的问题,我们需要:

    pos log() 或者最多 log10(MAX_INT)

    2) 那个数字是多少 这最多需要2个除法(或者零,使用步骤1的结果)。

    您还可以使用x86中的特殊fpu指令,该指令能够在BCD中保存浮点(我不知道它有多慢)。

    更新:第一步可以更快地完成,没有任何划分,使用如下二进制搜索:

    int my_log10(unsigned short n){
        // short: 0.. 64k -> 1.. 5 digits 
        if (n < 1000){  // 1..3
            if (n <  10) return 1;
            if (n < 100) return 2;
            return 3;
        } else { // 4..5
            if (n < 10000) return 4;
            return 5;
        }
    }
    
        2
  •  2
  •   JoshD    14 年前

    如果你的索引开始于最低有效位,你可以这样做

    p = pow(10,index);
    x = (x / (p*10) * (p*10) + value * p + x % p).
    

    但由于索引是向后的,所以字符串可能是一种方法。它也将更具可读性和可维护性。

        3
  •  1
  •   AnT stands with Russia    14 年前
    1. 计算“面具” M index ,在哪里 指数 是从右边开始的一个从零开始的索引。如果需要从左侧索引,请重新计算 指数 相应地。

    2. 计算“前缀” PRE = x / (M * 10) * (M * 10)

    3. 计算“后缀” SUF = x % M

    4. MID = value * M

    5. 生成新号码 new_x = PRE + MID + POST .

    P.S.ruslik的回答更加优雅:)

        4
  •  1
  •   Mark Ransom    14 年前

    你需要先弄清楚你输入的数字是多少。我可以想出两种方法,一种是循环,另一种是对数。这是循环版本。对于负输入和零输入,以及当索引超出界限时,可能也会失败,但这是一个起点。

    def f(x, index, value):
        place = 1
        residual = x
        while residual > 0:
            if index < 0:
                place *= 10
            index -= 1
            residual /= 10
        digit = (x / place) % 10
        return x - (place * digit) + (place * value)
    

    另外,这是Python代码。像这样简单的事情的原理很容易解决,但是细节非常复杂,你真的需要迭代一下。在这种情况下,我从一个原则开始,我想减去旧的数字,然后加上新的数字;从那里得到正确的乘数。

        5
  •  0
  •   GregC Benjamin Baumann    14 年前

    如果你说的是性能的话,你必须对你的计算平台有明确的要求。

    我将把数字转换成成对的十进制数字,每个数字4位。

    然后我再把号码拼起来。

    有些汇编程序做得很好。