Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] массивы


Автор: MCGRIS 20.10.2009, 23:04
Поразрядная обработка целых чисел
Циклически сдвинуть длинное целое число N на K разрядов влево.  





ПОМАГИТЕ пожалуйста!!! 


Сори да операции! а просто только начал учиться программированию недавно! просто чайник пока!)

Заранее спасибо за помощь!

Автор: DrHex 20.10.2009, 23:51
 может быть >> << операции???

Автор: baldina 20.10.2009, 23:56
Код

for (int i=1; i <= K; ++i)
{
  int b = !!(N&~(-1UL>>1));
  (N<<=1)|=b;
}

Автор: alexdndz 20.10.2009, 23:58
попробуй записать цифры числа n в элементы одномерного массива, затем массив читая с конца, делить его на 10, точнее находить остаток от дления и записывать как тебе надо

Автор: baldina 21.10.2009, 01:16
мдя... похоже шутка не удалась...  smile 

MCGRIS, вот так:
Код

N = (N << K) | ((unsigned long)N >> sizeof (unsigned long) * 8 - K)


Автор: MCGRIS 21.10.2009, 18:11
Цитата(alexdndz @ 20.10.2009,  23:58)
попробуй записать цифры числа n в элементы одномерного массива, затем массив читая с конца, делить его на 10, точнее находить остаток от дления и записывать как тебе надо

как это сделать как примерно код выглядит?

Автор: Alexeis 21.10.2009, 20:06
Цитата(MCGRIS @  20.10.2009,  22:04 Найти цитируемый пост)
длинное целое число N 

Что такое длинное целое число? Каково его представление в массиве?

Автор: bsa 26.10.2009, 12:55
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: mr.Anderson 26.10.2009, 22:36
Длинное целое число - это число, представленное в виде массива, каждый элемент которого содержит одну цифру этого числа (в естественном виде, 12345 даст массив {1, 2, 3, 4, 5}), что позволяет сильно расширить диапазон используемых чисел. Поразрядный сдвиг понятно что такое, просто сдвиг всех цифр влево или вправо на одну, переполняющиеся (выходящие за границу) дописывать в начало или конец массива в зависимости от того, куда двигаем.

Автор: baldina 27.10.2009, 01:47
mr.Anderson телепат? Из чего следует определение "длинного целого числа"? 
Цитата

Поразрядная обработка целых чисел
Циклически сдвинуть длинное целое число N на K разрядов влево.  

В компьютерах числа представлены в двоичном виде, соответственно разрядом обычно считается двоичный разряд.

Кстати. Не теряя общности.
Цитата

Код

N = (N << K) | ((unsigned long)N >> sizeof (unsigned long) * 8 - K)



Если
Код

class LongInt : public std::vector<unsigned> {
public:
  static const int digits = 10;
  LongInt () : std::vector<unsigned>(digits) {}
  LongInt& operator<<= (unsigned d) { std::rotate (begin(), begin()+d, end()); std::fill (begin()+d, end(), int()); return *this; }
  LongInt& operator>>= (unsigned d) { std::rotate (begin(), begin()+(digits-d),end()); std::fill (begin(), begin()+(digits-d), int()); return *this;}
};

LongInt operator<< (const LongInt& number, unsigned d) 
{ 
   LongInt result (number);
   return result <<= d;
}

LongInt operator>> (const LongInt& number, unsigned d) 
{ 
   LongInt result (number);
   return result >>= d;
}

template <unsigned digits>
unsigned or (unsigned lhs, unsigned rhs)
{
  return (lhs|rhs)%digits;
}

LongInt operator| (const LongInt& lhs, const LongInt& rhs) 
{ 
   LongInt result;
   std::transform (lhs.begin(), lhs.end(), rhs.begin(), result.begin(), or<LongInt::digits>);
   return result;
}

то
Код

LongInt N;
unsigned K;

N = (N<<K)|(N>>(LongInt::digits - K));


хотя канешно проще всего лишь

Код

LongInt& LongInt::rotate (unsigned K)
{
  std::rotate (begin(), begin()+K, end());
  return *this;
}
LongInt rol (const LongInt& number, unsigned K)
{
   LongInt result (number);
   return result.rotate (K);
}

N = rol (N, K);

Автор: mr.Anderson 28.10.2009, 21:10
Цитата
 телепат?

Практикую иногда. ;) Решал в свое время задачи на длинную арифметику. Это из той же оперы.

Автор: baldina 28.10.2009, 23:29
блин, я как всегда в танке. слово "массивы" в теме. посыпаю пеплом все места...

Автор: MCGRIS 7.1.2010, 21:56
Спасибо народ! а на си просто как это будет?

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