Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Реверс цыфр в числе


Автор: GSasha 22.1.2009, 19:39
Есть задание:
There is number e.g. 6789 it needs to write function, which returns vise versa number – 9876.
Мой вариант таковой
Код

int ReverseNum( int n )
{
    int nRes = 0;

    while ( n )
    {
        int nCurrent = n % 10;

        nRes *= 10;
        nRes += nCurrent;
        n /= 10;      
    }

    return nRes;
}

Возможно ли улучшить данный вариант (без использования atoi и itoa)?

Автор: Kallikanzarid 23.1.2009, 04:00
Для десятичных чисел, ИМХО, нет. Для 16-х и 2-х - можно.

Автор: mes 23.1.2009, 04:17
Цитата(GSasha @  22.1.2009,  18:39 Найти цитируемый пост)

Возможно ли улучшить данный вариант

разве что только избавиться от лишней переменной и облегчить цикл :
Код

int ReverseNum( int n )
{
    int nRes = 0;
    for (; n;  n /= 10  )
         nRes *= 10,  nRes += n % 10;

    return nRes;
}


П.С. код не при больших значениях  будет выдавать неверный результат в следствии переполнения..


Автор: GSasha 23.1.2009, 08:35
ок, всем спасибо. smile 

Автор: mrbrooks 23.1.2009, 08:40
GSasha, а ты число вводишь с клавиатуры или оно у тебя жестко забито в программе?

Автор: GoldFinch 23.1.2009, 09:28
можно загрузить в fpu, преобразовать в bcd, поменять байты местами, загрузить в fpu, записать на место
неисключено что это даже быстрее цикла

Автор: GSasha 23.1.2009, 09:31
Цитата(mrbrooks @  23.1.2009,  08:40 Найти цитируемый пост)
а ты число вводишь с клавиатуры или оно у тебя жестко забито в программе? 

с клавиатуры
Код

 int n;
 cin >> n;
 cout << ReverseNum( n );


Добавлено через 4 минуты и 7 секунд
Цитата(GoldFinch @  23.1.2009,  09:28 Найти цитируемый пост)
можно загрузить в fpu, преобразовать в bcd, поменять байты местами, загрузить в fpu, записать на место
неисключено что это даже быстрее цикла 

 smile  smile 

Автор: mrbrooks 23.1.2009, 09:47
Код

#include <stdio.h>
#include <string.h>

int main() {
    char str[50];
    scanf( "%s", str );
    _strrev( *str == '-' ? str + 1 : str );
    printf( "%s\n", str );
}


Добавлено @ 09:53
с потоками ввода/вывода
Код

#include <iostream>
#include <string.h>

int main() 
{
    char str[50];
    std::cin.getline(str, sizeof(str)+1);
    _strrev(*str == '-'?str+1:str);
    std::cout << str;
    std::cin.get();
    return 0;
}

Автор: GoldFinch 23.1.2009, 12:56
для 8 цифр
Код

int foo(int x)
{
char bcd[10];
__asm{
  fild dword ptr [x]
  fbstp dword ptr [bcd]
  pop eax
  pop edx
  bswap eax
  bswap edx
  push eax
  push edx
  fbld dword ptr [bcd]
  fistp dword ptr [bcd]
  pop eax
}}

Автор: mes 23.1.2009, 14:43
Цитата(GSasha @  22.1.2009,  18:39 Найти цитируемый пост)

Возможно ли улучшить данный вариант


Цитата(GoldFinch @  23.1.2009,  11:56 Найти цитируемый пост)
для 8 цифр

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

Автор: Dov 23.1.2009, 15:04
Цитата(GSasha @  22.1.2009,  18:39 Найти цитируемый пост)
Возможно ли улучшить данный вариант (без использования atoi и itoa)?

Не знаю, что ты имеешь ввиду под словом "улучшить" , но могу предложить такой вариант:
Код
int ReverseNum( int n )
{
    int  nRes;
    char buf[11];

    sprintf(buf, "%d", n);
    sscanf(_strrev(buf), "%d", &nRes);   

    return nRes;
}


Автор: jonie 23.1.2009, 15:48
на скорость увеличить можно, при условиях ограниченности чисел - можно сделать таблицу предрасчитанных значений 8)
много памяти, зато быстро должно быть...

Автор: GSasha 23.1.2009, 16:23
Цитата(Dov @  23.1.2009,  15:04 Найти цитируемый пост)
но могу предложить такой вариант:

хороший вариант, имхо
и красиво смотрится

Автор: jonie 23.1.2009, 16:39
и чем это он хороший ?

Автор: GSasha 23.1.2009, 17:07
Цитата(jonie @  23.1.2009,  16:39 Найти цитируемый пост)
и чем это он хороший ? 

А чем не хороший?

Автор: GSasha 25.1.2009, 12:36
Думаю вопрос решен. спасибо всем

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)