LINUX.ORG.RU
решено ФорумTalks

Есть ли какая нибудь формула для переворачивания числа задом-наперёд?

 ,


1

4

т.е. 123 -> 321
Скорее всего нет, но мало ли.
ЗЫ. Решения на языках программирования не предлагать. Я тоже так могу, это легко и не интересно.

★★★★★

Последнее исправление: sudopacman (всего исправлений: 1)

Какие операции ты хочешь использовать?

Легко реализовать, используя floor.

tyakos ★★★
()
Последнее исправление: tyakos (всего исправлений: 1)

А в какое число эта формула должна превращать 10, например? Обратимой такая формула (функция?) в общем случае не может быть, полагаю.

sevenredlines
()
Ответ на: комментарий от sevenredlines

Для чисел с 1 и более нулём в конце или начале значение должно быть не определено. А то фиг пойми что получится.

sudopacman ★★★★★
() автор топика

В математике такой формулы нет вроде.

gssomi ★★
()

Есть ли какая нибудь формула для переворачивания числа задом-наперёд?

но ведь число перевернуть можно?? вы-же переворачиваете..Значит есть «формула»/алгоритм (что вообще-то одно и то-же).. если хотите можно записать в виде ряда. Можно по другому.

MKuznetsov ★★★★★
()

Нету выражения для определения разрядности, значит нету и формулы никакой. Если мы ограничеваемся арифметическими операциями.

Zaskar
()

Так, на первый взгляд, полиномиалом такое провернуть не получится, так как полиномиал конечной степени будет работать только для конечного количества числел из Z.

tyakos ★★★
()

Сначала определись с тем, какие функции и операции должны быть допустимы в такой «формуле». Потом, скорее всего, получишь ответ исходя из свойств этих функций.

А то, понимаешь ли, я могу сказать, что есть функция swap(x), заданная бесконечной таблицей.

intelfx ★★★★★
()
Ответ на: комментарий от sudopacman

То, что ты написал в ОП, определяет функцию, т.е. твой вопрос бессмысленен.

tyakos ★★★
()

MS EULA 3.0

public static BigInteger reverseIt(BigInteger in) {
return new BigInteger(new StringBuilder(in.abs().toString()).reverse().toString()).multiply(BigInteger.valueOf(in.signum()));
}
telepat
()
Ответ на: MS EULA 3.0 от telepat

А на языке математики как?

sudopacman ★★★★★
() автор топика

Пыхоответ на основной вопрос жизни, вселенной и вообще:

echo ((int) strrev(24));
(каст по желанию можешь убрать и не будет убивать «ведущий» ноль)

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Точно. Просто сильно спешил.

Хотя... не факт. Но мне лениво думать сейчас.

И ещё нужно добавить размер буфера, ибо snprintf, а не sprintf

alman ★★★
()
Последнее исправление: alman (всего исправлений: 2)

Ну смотри, как я понимаю, тебе для множества целых чисел.
Тогда написать это можно как-то так:

(define (swap n)
  (if (< (abs n) 10) n
      (+ (* (remainder n 10) (expt 10 (floor (log10 (abs n))))) 
         (swap (quotient n 10)))))

Соответственно, эту функцию можно описать как:
f(n) = n; |n| < 10,
f(n) = (n%10)*(10^floor(log10(|n|))) + f(n/10)

при условии, что у нас % - остаток от целочисленного деления, floor - отбрасывает дробную часть, log10 - десятичный логарифм и / - целочисленное деление.

Возможно, можно и для вещественных обобщить, лень думать сейчас.

unikoid ★★★
()
Последнее исправление: unikoid (всего исправлений: 1)

http://code.runnable.com/VrOz3-S_25k0N7JL/output

#include <stdio.h>
 
int main()
{
   int n, reverse = 0;
 
   printf("Enter a number to reverse\n");
   scanf("%d", &n);
 
   while (n != 0)
   {
      reverse = reverse * 10;
      reverse = reverse + n%10;
      n       = n/10;
   }
 
   printf("Reverse of entered number is = %d\n", reverse);
 
   return 0;
}

int13h ★★★★★
()
Последнее исправление: int13h (всего исправлений: 1)
Ответ на: комментарий от Zaskar

Если у нас есть функция округления, то легко выразить математически количество разрядов - надо просто округлить в верхнюю сторону десятичный логарифм числа (для других систем счисления - другое основание логарифма).

Если функции округления нет. В математике вроде как есть оператор взятия дробной части числа (я видел на одном из уроков математике в школе в старших классах такой финт). Используя его и простую арифметику можно выразить функцию округления.

Данная функция будет определена для любого натурального числа. Если брать число по модулю - для любого целого кроме 0. Ноль придётся рассматривать как отдельный случай. В математике допускается, чтобы функция была задана разными формулами на разных участках. Например, так определяют модуль - на интервале от минус бесконечности до нуля, он равен минус числу, на интервале от нуля до плюс бесконечности - числу.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 2)
Ответ на: комментарий от alman

Преобразование числа в строку задействует столько же делений, а преобразование из строки в число столько же умножений в любом случае, поэтому это лучшее решение даже если умножение и деление аппаратно не поддерживаются. Разве что у них есть аппаратное переворачивание чисел или аппаратное преобразование числа в строку и обратно.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 3)
Ответ на: комментарий от KivApple

Я тоже об этом подумал. А так же идти сразу с двух сторон строки к центру свопая «текущие крайние» местами. alman

Хотя щас мне кааца уже что эффективнее будет вообще с битовыми поиграться.

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от deep-purple

Что, кстати, хорошо - будет возвращено именно количество реально записанных байт кроме нуля. То есть если буфера не хватило и нуль не был записан, алгоритм отработает абсолютно корректно. А при использовании strlen будет UB, если не применить дополнительных мер (передать snprintf размер буфера на 1 меньше и принудительно занулять последний байт).

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

Точно, я об этом не подумал. Признаю - решение от int13h безусловно лучше.

alman ★★★
()

Плюсового решения тут еще не вбрасывали:

auto snumber = std::to_string(123);
std::reverse(snumber.begin(), snumber.end());
int intnumber = std::stoi(snumber);

CatsCantFly
()
Ответ на: комментарий от Pythagoras

Да что вы мне каждый про логарифм отвечаете? Я вроде ясно сказал про ограничение арифм. операциями, какой смысл тогда вообще было создавать тред если можно логарифмировать, округлять, итд?

Zaskar
()
Ответ на: комментарий от goingUp

Я знаю. Приведешь выражение для получения целового числа разрядов?

Zaskar
()

есть. Написание формулы - 10€.

dikiy ★★☆☆☆
()
Ответ на: комментарий от KivApple

snprintf и sprintf возвращают длину полученной строки, можно использовать это значение вместо вызова strlen.

Точно. Отсюда вывод - не надо спешить при ответе на вопрос, а лучше сначала пару минут подумать.

alman ★★★
()

Ответ хаскеля:

Prelude> (\x -> read x :: Int) . reverse . show $ 123
321

iVS ★★★★★
()
Ответ на: комментарий от invy

Я хочу, чтобы было обсуждение. Тупо посмотреть в гугле — не интересно.

sudopacman ★★★★★
() автор топика

В математике такой функции быть не может, так как математика работает с числами, а не их текстовыми представлениями

GanGSISoft ★★
()
Ответ на: комментарий от GanGSISoft
Ответ на: а как быть с числом пи? от next_time

например. с любым иррациональным числом?

никак. ТЗ относится к натуральным числам.

dikiy ★★☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.