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


Автор: Dello 28.11.2007, 21:23
Задание звучит так: поменять местами цифры двухзначного числа, не используя свойства позиционной системы счисления. Т.е., насколько я понял, надо применять побитовые операции, т.к. инструментарий, который можно использовать - это операции и инструкции С++. Помогите, пожалуйста.

Автор: MAKCim 28.11.2007, 22:05
перевести в строку
изменить порядок следования символов
перевести обратно в число

Автор: JackYF 28.11.2007, 22:06
Ответ звучит так: если от тебя кода не будет, то тебе прямая дорога в Центр Помощи.

Автор: cardinal 28.11.2007, 22:07
Код

int x = 59;
int a, b;

a = x / 10; // 5
b = x - a * 10; // 9

y = b*10 + a; // 95

Так на скорую руку...

Автор: MAKCim 28.11.2007, 22:09
cardinal
имхо, тут используется
Цитата(Dello @  28.11.2007,  21:23 Найти цитируемый пост)
свойства позиционной системы счисления


Автор: Dello 28.11.2007, 22:12
Люди, вы читать умеете? Черным по белому написано: не используя свойства позиционной системы счисления. Нельзя переводить в строку. Использовать побитовые операции. Мне кажется, деление на 10 - это использование позиционной СС, перевод в строку - не очень побитовая операция. Я не прав?

Автор: MAKCim 28.11.2007, 22:15
Dello
Цитата(Dello @  28.11.2007,  22:12 Найти цитируемый пост)
Нельзя переводить в строку.

ты этого не написал в своем первом посте
Цитата(Dello @  28.11.2007,  22:12 Найти цитируемый пост)
Использовать побитовые операции

Цитата(Dello @  28.11.2007,  21:23 Найти цитируемый пост)
Т.е., насколько я понял, надо применять побитовые операции,

это ты так решил или тебе сказали?  smile 

Автор: JackYF 28.11.2007, 22:17
Я, конечно, извиняюсь, но задание звучит так: нарубите, пожалуйста, дров, только деревьев и топора нет.

Число - это всего лишь биты в памяти. Каким образом, не зная основы системы счисления, можно поменять цифры в числе?

Автор: bsa 28.11.2007, 22:18
Dello, как вводятся данные? В какой системе счисления?
Если данные вводятся в виде строки, то можно просто поменять символы.
Если данные вводятся в 16-ти, 8-ми или двоичной системах счисления, то можно использовать сдвиги и побитовые AND и OR.

Автор: Dello 28.11.2007, 22:21
MAKCim,
Цитата

это ты так решил или тебе сказали?


сказали.

Добавлено через 3 минуты и 7 секунд
JackYF, полностью согласен.  smile  Но дело в том, что это я не пытаюсь создать такое положение, а меня в такое положение самого поставили. Причем в том, что это можно сделать, я абсолютно уверен, так как на это указал компетентый человек (но вредный, видимо).

bsa В десятичной. Строки нельзя использовать.

Автор: bsa 28.11.2007, 22:24
Dello, вот найди того, кто сказал и пусть объяснит поподробней.

Автор: MAKCim 28.11.2007, 22:25
Dello
имхо, в 10-ой СС это никак не сделаешь

Автор: MAKCim 28.11.2007, 22:53
Код

int array[] = {
    1, 11, 21, 31, 41, 51, 61, 71, 81, 91, 2, 12, 22, 32, 42, 52, 62, 72, 82, 92,
    3, 13, 23, 33, 43, 53, 63, 73, 83, 93, 4, 14, 24, 34, 44, 54, 64, 74, 84, 94,
    5, 15, 25, 35, 45, 55, 65, 75, 85, 95, 6, 16, 26, 36, 46, 56, 66, 76, 86, 96,
    7, 17, 27, 37, 47, 57, 67, 77, 87, 97, 8, 18, 28, 38, 48, 58, 68, 78, 88, 98,
    9, 19, 29, 39, 49, 59, 69, 79, 89, 99
};

inline int convert(int number) {
    return array[number - 10];
}

Автор: bsa 28.11.2007, 22:54
MAKCim, не лень было?

Автор: MAKCim 28.11.2007, 22:55
Цитата(bsa @  28.11.2007,  22:54 Найти цитируемый пост)
MAKCim, не лень было? 

неа  smile 
3 минуты драгоценного времени

Автор: cardinal 28.11.2007, 23:20
Цитата(Dello @  28.11.2007,  21:21 Найти цитируемый пост)
В десятичной. Строки нельзя использовать. 

Я если честно так и не понял, где я использовал строки или 
Цитата(Dello @  28.11.2007,  21:12 Найти цитируемый пост)
используя свойства позиционной системы счисления.

Какие свойства? И что они в коде MAKCim'а не используются? 

Автор: MAKCim 28.11.2007, 23:24
Цитата(cardinal @  28.11.2007,  23:20 Найти цитируемый пост)
Я если честно так и не понял, где я использовал строки или 

делишь на 10, чтобы получить десятичный разряд
Цитата(cardinal @  28.11.2007,  23:20 Найти цитируемый пост)
И что они в коде MAKCim'а не используются?  

да вроде как нет

Автор: cardinal 28.11.2007, 23:49
Цитата(MAKCim @  28.11.2007,  22:24 Найти цитируемый пост)
делишь на 10, чтобы получить десятичный разряд

Так а где здесь "строки", они же char* они же string?
Цитата(MAKCim @  28.11.2007,  22:24 Найти цитируемый пост)
да вроде как нет 

Так на дело смотреть, так и у тебя цифра 10 присутствует.

Или просто задание звучит так: сделать!, но не просто, а через жопу? smile 

Автор: MAKCim 28.11.2007, 23:55
Цитата(cardinal @  28.11.2007,  23:49 Найти цитируемый пост)
Так а где здесь "строки", они же char* они же string?

строки не причем
ты используешь свойство позиционной СС
Цитата(cardinal @  28.11.2007,  23:49 Найти цитируемый пост)
Так на дело смотреть, так и у тебя цифра 10 присутствует.

10 - это смещение в массиве
т. к двузначных чисел всего 90
первое двузначное число - 10, а индекс в массиве начинается с 0
т. е 10 здесь используется совсем не в контексте позиционной СС

Автор: cardinal 29.11.2007, 00:40
Почитал тут
http://works.tarefer.ru/69/100903/index.html
помоему понял что хотят, а именно "перевернуть двухзначное число, рассматривая его как строку, но не пользуясь строками" smile 

Помоему забить все это в массив как-то неэлегантно...

Но что-то придумать как добиться этого результата при помощи побитных операций не использую свойств позиционной СС не могу. smile 

Автор: Dims 29.11.2007, 08:47
В задании ведь не сказано, что число десятичное smile
Так что, можно положить, что оно 16-ричное.
Поэтому, надо просто отсечь маской старший байт и сдвинуть младший влево на 4 бита, а затем побитово сложить со сдвинутым вправо на 4 бита исходным числом.

Автор: cardinal 29.11.2007, 10:01
В задании не сказано, а автором сказано
Цитата(bsa @  28.11.2007,  21:18 Найти цитируемый пост)
Dello, как вводятся данные? В какой системе счисления?

Цитата(Dello @  28.11.2007,  21:21 Найти цитируемый пост)
bsa В десятичной.

А в десятичной все нет так просто. Достаточно посмотреть на числа 8 и 9 smile 

Автор: bsa 29.11.2007, 15:23
с другой стороны, кто мешает интерпретировать 10-ичное, как 16-ричное?

Автор: JackYF 29.11.2007, 16:26
Цитата(bsa @  29.11.2007,  15:23 Найти цитируемый пост)
с другой стороны, кто мешает интерпретировать 10-ичное, как 16-ричное?

никто... результат будет неправильный.

Автор: bsa 29.11.2007, 18:17
"15" - это сколько?
можно представить, что это 0x15? затем методом сдвигов и логических OR и AND объединяем и получаем 0x51, выводим, получаем "51" - то что хотели?  smile 

Автор: cardinal 29.11.2007, 21:23
Цитата(bsa @  29.11.2007,  17:17 Найти цитируемый пост)
то что хотели? 

Нет, т.к. строками пользоваться нельзя... smile

Автор: bsa 29.11.2007, 21:35
cardinal, а вводить тогда как?!? программа читает из бинарного файла число?

Автор: MAKCim 29.11.2007, 22:35
Цитата(bsa @  29.11.2007,  18:17 Найти цитируемый пост)
можно представить, что это 0x15? затем методом сдвигов и логических OR и AND объединяем и получаем 0x51, выводим, получаем "51" - то что хотели? 

я полагаю, число представляется каким-то числовым типом (int, short, long)
поэтому этот метод не прокатит
Цитата(bsa @  29.11.2007,  21:35 Найти цитируемый пост)
а вводить тогда как?!? программа читает из бинарного файла число? 

Код

int convert(int number) {
...
}

int main() {
    int number;
    scanf("%d", &number);
    printf("%d\n", convert(number));
    return 0;
}

Автор: JackYF 29.11.2007, 23:35
Цитата(MAKCim @  29.11.2007,  22:35 Найти цитируемый пост)
scanf("%d", &number);

ага, scanf тоже пользуется тем, что система счисления десятичная smile

Автор: SergeCpp 30.11.2007, 12:49
Код
int reverse( int i )
{
    if( i < 90 || i > 99 )
    {
        return 0;
    }

    int i0( i >> 0 & 1 );
    int i1( i >> 1 & 1 );
    int i2( i >> 2 & 1 );
    int i3( i >> 3 & 1 );
    int i4( i >> 4 & 1 );
    int i5( i >> 5 & 1 );
    int i6( i >> 6 & 1 );
    int i7( i >> 7 & 1 );

    int v0( i0 ^ 1 );
    int v1( i1 ^ 1 );
    int v2( i2 ^ 1 );
    int v3( i3 ^ 1 );
    int v4( i4 ^ 1 );
    int v5( i5 ^ 1 );
    int v6( i6 ^ 1 );
    int v7( i7 ^ 1 );

    int r0( 1  );
    int r1( i0 );
    int r2( v1 );
    int r3( i0 ^ i1 ^ i2 );
    int r4( ( v5 & i4 & i3 & v2 & i1 & i0 ) |
            ( v5 & i4 & i3 & i2 & v1 & v0 ) |
            ( v5 & i4 & i3 & i2 & i1 & v0 ) |
            ( v5 & i4 & i3 & i2 & i1 & i0 ) |
            ( i5 & v4 & v3 & v2 & i1 & v0 ) );
    int r5( ( v5 & i4 & i3 & i2 & v1 & i0 ) |
            ( v5 & i4 & i3 & i2 & i1 & v0 ) |
            ( v5 & i4 & i3 & i2 & i1 & i0 ) |
            ( i5 & v4 & v3 & v2 & i1 & i0 ) );
    int r6( i5 );
    int r7( 0  );

    return r7 << 7 | r6 << 6 | r5 << 5 | r4 << 4 | r3 << 3 | r2 << 2 | r1 << 1 | r0 << 0;
}

Расширение диапазона предлагается как упражнение для господ интересующихся user posted image

Автор: MAKCim 30.11.2007, 13:13
SergeCpp
ты крут  smile  smile 

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