Тема: Перестановка цифр у числі
Читаю Прата "Мова програмування С". Розділ функції. Задача, яка дана у книжці звелась, до пошуку протилежного числа.
Задача:
Вводиться ціле число з клавіатури. Програма повинна вивести протилежне число. Наприклад вводиться число 123 виводиться 321.
Я реалізував цю задачу так (через рекурсію):
1) вводиться число num
2) шукається найменше arg = 10^n при якому num / arg = 0
3) функції, яка шукає обернене число передається num, arg та div = arg
а) створюється змінна d = div / 10
б) якщо при d не дорівнює 0, то продовжується виконання функції, якщо дорівнює 0, то повертається 0.
в) result = (num % div) / d
г) div з кожним викликом функції повинна зменшуватись у 10 разів, тому div = d
д) зворотнє число обчислюється за формулою result = result * arg / (div * 10) + conserveNumber (num, arg, div)
При введенні 123 обчислення будуть такими:
1) (123 % 1000) / 100 = 1
2) (123 % 100) / 10 = 2
3) (123 % 10) / 1 = 3
4) 3 * 1000 / (1 *10) = 300
5) 2 * 1000 / (10 * 10) = 20
6) 1 * 1000 / (100 * 10) = 1
7) 300 + 20 + 1 = 321
Ось такий алгоритм в мене вийшов. Я думаю, що це не правильний алгоритм. Кривий алгоритм.
Будь ласка, підскажіть, як краще організувати виконання даної задачі.
Код:
/* Тип int! Виведення обернутого числа до введеного (наприклад введено 123 - виведено 321) */
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int conserveNumber (int num, int arg, int div);
int initArg (int num);
int main (void){
int num, arg, div, opp;
printf ("Enter number: ");
while (scanf ("%d", &num) != false){
while (num / 10 == 0){
printf ("Enter number more than 10: ");
if (scanf ("%d", &num) != true){
printf ("Error\n!");
exit (1);
}
}
arg = initArg (num);
div = arg;
opp = conserveNumber(num, arg, div);
printf ("Number = %d\n", opp);
printf ("Enter number: ");
}
return 0;
}
int initArg (int num){
int arg;
int i;
for (arg = 10, i = 1; (num % arg) / i != 0; arg *= 10, i *= 10)
;
return arg / 10;
}
int conserveNumber (int num, int arg, int div){
int result;
int d = div / 10;
if (d != 0)
result = (num % div) / d;
else return 0;
div = d;
result = result * arg / (div * 10) + conserveNumber (num, arg, div);
return result;
}