Страница 1 из 1

разложение числа на разряды

Добавлено: Ср фев 01, 2012 20:31:53
electronic255
Как разложить число например (4568) на разряды 4 5 6 8? Используя только сложение и вычитание .Функция должна быть универсальной,даем ей любое число и получаем количество тысяч ,сотен ,десятков и единиц. Пишу на Си. Если такая тема есть,просьба модераторов не материться,поисковиком не нашел,а прочитать 114 страниц терпения не хватит.

Re: разложение числа на разряды

Добавлено: Ср фев 01, 2012 20:36:24
Axon
Отнимаешь по 1000 - считаешь сколько отнялось без перехода через ноль, потом по 100, 10 и по 1.

Re: разложение числа на разряды

Добавлено: Ср фев 01, 2012 20:59:01
demson
Для начала необходимо реализовать 2 базовые ф-и / и % деление без остатка и остаток от деления.
50/10 по десятичной системе.
k=52;
cel=0;
while (k>=10){cel++; k-=10;}

получим cel целых k десятых все просто.

k>=100 это делим на сто с остатком от 0 до 99

Re: разложение числа на разряды

Добавлено: Ср фев 01, 2012 22:25:40
electronic255
demson писал(а):Для начала необходимо реализовать 2 базовые ф-и / и % деление без остатка и остаток от деления.
50/10 по десятичной системе.
k=52;
cel=0;
while (k>=10){cel++; k-=10;}

получим cel целых k десятых все просто.

k>=100 это делим на сто с остатком от 0 до 99

не подходит - можно использовать только сложение,вычитание и сравнение

Re: разложение числа на разряды

Добавлено: Чт фев 02, 2012 08:36:43
Engineer_Keen
electronic255 писал(а):не подходит - можно использовать только сложение,вычитание и сравнение

А в приведенном demsonом коде есть другие операции?

Re: разложение числа на разряды

Добавлено: Чт фев 02, 2012 09:05:52
ibiza11
Engineer_Keen, просто топикстартер читает, видимо, исключительно по диагонали.

Код: Выделить всё

unsigned long bin_bcd(unsigned short a)
{
  //структура для функции bin_bcd 0-9999
  struct
  {
    unsigned char tens,hundreds,thousands;
    unsigned short units;
  }bcd;
 
  bcd.tens=0x30;
  bcd.hundreds=0x30;
  bcd.thousands=0x30;
  bcd.units=a;
  if(bcd.units>=1000)
  {
    while (bcd.units>=1000)
    {
      bcd.units-=1000;
      bcd.thousands++;
    }
  }
  if(bcd.units>=100)
  {
    while (bcd.units>=100)
    {
      bcd.units-=100;
      bcd.hundreds++;
    }
  }
  if(bcd.units>=10)
  {
    while (bcd.units>=10)
    {
      bcd.units-=10;
      bcd.tens++;
    }
  }
  bcd.units+=0x0030;
  return((long)bcd.thousands<<24|(long)bcd.hundreds<<16|bcd.tens<<8|bcd.units);
}