В простейшем случае (с учетом цифр нумеруются от LSB до MSB, первый из которых является 0), зная старый цифру, мы могли бы сделать так же просто, как:
num += (new_digit - old_digit) * 10**pos;
Для реальной задачи нужно было:
1) MSB первой версии pos
, которые могут стоить вам log()
или в лучшем случае log10(MAX_INT)
деления на десять (может быть улучшена с помощью бинарного поиска).
2) цифра от pos
, которой потребуется не более 2 делений (или ноль, используя результаты этапа 1).
Вы также можете использовать специальную инструкцию fpu от x86, которая может сохранить поплавок в BCD (я понятия не имею, насколько это медленное время).
UPDATE: первый шаг можно сделать еще быстрее, без каких-либо подразделений, с бинарным поиском, как это:
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;
}
}
Итак, ваш индекс подсчитывается слева направо (от самого значимого до наименее значимого?) – JoshD
Я принимаю его, мы можем считать базу 10? – LarsH
Ну, преобразование в строку, замена цифры и преобразование обратно в целое число - это самый быстрый способ, который я знаю * коду *, но что-то говорит мне, что это не то, что вы ищете ... –