Поменять соседние цифры числа местами
Сейчас разбираюсь вот с каким заданием (краткий пересказ):
На вход дано целое число n. Преобразуйте его таким образом, чтобы две соседние цифры числа были поменяны местами.
То есть, у нас есть целое число n = 123456, его необходимо преобразовать в число 214365.
Вот мой код на C (код рабочий). Хотелось бы услышать критику со стороны насчет его эффективности. Что бы вы улучшили или предложили изменить? Потому что мне его надо будет сдать, а принимающий достаточно строгий)
#include <stdio.h>
int rewrite(int n) {
int var_1, var_2;
int n_new = 0;
while (n >= 10) { //Ставим условие >= 10 по причине того,
//что надо var_1 и var_2 присвоить по цифре
var_1 = n % 10; //То есть надо иметь в запасе как минимум десяток
n /= 10;
var_2 = n % 10;
n /= 10;
n_new *= 10; //Записываем n_new таким образом, чтобы
n_new += var_2; //соседние цифры были поменяны местами
n_new *= 10;
n_new += var_1;
}
while (n_new != 0) { //Мы записывали число n_new при этом делили
//число n с конца, следовательно, его надо перевернуть
n *= 10;
n += n_new % 10;
n_new /= 10;
}
return n;
}
int main() {
int n;
printf("Пожалуйста, введите число n: ");
scanf("%d", &n);
printf("Обработанное число: %d\n", rewrite(n));
return 0; }
Ответы (1 шт):
12345 во что должно превратиться? В 103254 или в 13254? И что делать с отрицательными числами?
Если считать, что в 103254, то я бы со скоростью ввода текста :) делал так:
unsigned int r2(unsigned int n)
{
unsigned int m = 0;
for(unsigned int e = 1;n;n/=100)
{
unsigned int d = n%100;
d = (d%10)*10+d/10;
m += d*e;
e *= 100;
}
return m;
}
Если в 13254, то
unsigned int r2(unsigned int n)
{
unsigned int m = 0, e = 1;
for(;n > 10;n/=100)
{
unsigned int d = n%100;
d = (d%10)*10+d/10;
m += d*e;
e *= 100;
}
return m + n*e;
}
О критике...
Ну, например, n_new *10;, вероятно, должно быть n_new *=10;.
А еще введите число, скажем, 120304, и посмотрите, что получится :(