Информация об изменениях

Сообщение Re[2]: Вопрос на элегантность решения от 13.10.2014 7:01

Изменено 13.10.2014 7:09 Muxa

V>Самое быстрое и в принципе понятное будет:
V>
V>if (i >= 100000000) i /= 100000000;
V>if (i >= 10000) i /= 10000;
V>if (i >= 100) i /= 100;
V>if (i >= 10) i /= 10; // тут имеем число из 2 левых цифр
V>i = i % 10; // тут вторая слева цифра
V>if (i % 3 == 0) {
V>  // вторая слева цифра числа делится на 3
V>} else {
V>  // вторая слева цифра числа НЕ делится на 3
V>}
V>


Делений многовато для самого быстрого решения.
Я бы сделал что-то вроде:
int64_t divisor[1<<4] = { 1, 10, 100, 10*100, 10000, 10*10000, 100*10000, 10*100*10000, 100000000, 10*100000000, 100*100000000, 10*100*100000000, 10000*100000000, 10*10000*100000000, 100*10000*100000000, 10*100*10000*100000000, };
size_t mask = 0;
if (i >= 100000000) mask |= (1<<3);
if (i >= 10000)     mask |= (1<<2);
if (i >= 100)       mask |= (1<<1);
if (i >= 10)        mask |= (1<<0);
i = i/divisor[mask];
int32_t divisible_by_3[10] = {1,0,0,1,0,0,1,0,0,1};
if (divisible_by_3[i]) {
  // вторая слева цифра числа делится на 3
} else {
  // вторая слева цифра числа НЕ делится на 3
}
Re[2]: Вопрос на элегантность решения
V>Самое быстрое и в принципе понятное будет:
V>
V>if (i >= 100000000) i /= 100000000;
V>if (i >= 10000) i /= 10000;
V>if (i >= 100) i /= 100;
V>if (i >= 10) i /= 10; // тут имеем число из 2 левых цифр
V>i = i % 10; // тут вторая слева цифра
V>if (i % 3 == 0) {
V>  // вторая слева цифра числа делится на 3
V>} else {
V>  // вторая слева цифра числа НЕ делится на 3
V>}
V>


Делений многовато для самого быстрого решения.
Я бы сделал что-то вроде:
int64_t divisor[1<<4] = { 1, 10, 100, 10*100, 10000, 10*10000, 100*10000, 10*100*10000, 100000000, 10*100000000, 100*100000000, 10*100*100000000, 10000*100000000, 10*10000*100000000, 100*10000*100000000, 10*100*10000*100000000, };
size_t mask = 0;
if (i >= 100000000) mask |= (1<<3);
if (i >= 10000)     mask |= (1<<2);
if (i >= 100)       mask |= (1<<1);
if (i >= 10)        mask |= (1<<0);
i = i/divisor[mask];
int32_t divisible_by_3[100] = {1,0,0,1,0,0,1,0,0,1,...........};
if (divisible_by_3[i]) {
  // вторая слева цифра числа делится на 3
} else {
  // вторая слева цифра числа НЕ делится на 3
}