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


Автор: relok 15.11.2010, 22:15
здравствуйте
даны три интовых числа - к примеру 97 97 97 (в общем по аски 0...255)
реально ли их как то объединить в 979797 (девятьсот семьдесят девять тысяч, семьсот девяносто семь) покрасивее?

в голову приходит не очень красиво:

берем первое число, считаем сколько знаков в остальных и умножаем первое на 10 ^ кол-во знаков
1. 97*10000=970000
2. берем второе число и умножаем на десять в степени количество знаков в третьем
  97*100=9700
3. складываем получившиеся числа 
    970000 + 9700 + 97 = 979797

я бы погуглил, да не представляю как назвать это=) 

о. написал это и придумал такой вопрос: реально ли узнать, сколько знаков в числе(без проверок типа 0...9 10...99 100...255?) 
тогда всё проще : 99 + 98*10^(знаков(99)) + 97*10^(знаков(98)+знаков(99))=979899

Автор: bsa 15.11.2010, 22:59
тебе нужно получить число или строку?
Для строки все просто: sprintf(buffer, "%i%i%i", num1, num2, num3);
Для числа сложней:
Код
static const int num[] = {91, 92, 93};
int res = 0;
int i = 0;
for(;;) {
   res += num[i];
   if (++i >= 3)
      break;
   for(int j = 10;; j *= 10) {
      if (j > num[i]) {
         res *= j;
         break;
      }
   }
}

Автор: relok 15.11.2010, 23:11
ну это тоже не очень красиво
просто реализовать можно многими способами

а я хотел что-то красивое, может даже встроенное

не очень понятно, что вы написали+) я сделал так

int chislo(unsigned char ch)
{
    int n=ch;
    if((n>=0)&(n<10)) return 1;
    if((n>9) &(n<100)) return 2;
    if((n>99))            return 3;
}

c=msg[0]+msg[1]*pow(10,chislo(msg[0]))+msg[2]*pow(10,(chislo(msg[1])+chislo(msg[0])));
       97    +   97    *  10^2                          + 97      *   10^(2+2)

если нужно будет больше трех чисел, подогнать всё в фор не сложно думаю)

но это не эстетично, как то по деревенски)

Автор: mes 15.11.2010, 23:26
Цитата(bsa @  15.11.2010,  21:59 Найти цитируемый пост)
Код

static const int num[] = {91, 92, 93};
int res = 0;
int i = 0;
for(;;) {
   res += num[i];
   if (++i >= 3)
      break;
   for(int j = 10;; j *= 10) {
      if (j > num[i]) {
         res *= j;
         break;
      }

так вроде чуть проще :
Код

static const int num[] = {91, 92, 93};
int res = 0;

for (int i=0; i<3; ++i) { 
   if (i) 
   { int j=10;
     for(; j<num[i]; j *= 10);
     res *=j;          
   }
   res += num[i];
}



Добавлено @ 23:29
Цитата(mes @  15.11.2010,  22:26 Найти цитируемый пост)
   if (i) 

или if (res).. также  если планируется "пристегнуть" к уже существующему числу .. т.е. для изначального int res = some_value;

Добавлено через 8 минут и 39 секунд
Цитата(relok @  15.11.2010,  22:11 Найти цитируемый пост)
но это не эстетично, как то по деревенски) 

оберните в функцию принимающую массив и отдающую результат и будет не по деревенски smile

Добавлено через 10 минут и 35 секунд
Цитата(mes @  15.11.2010,  22:26 Найти цитируемый пост)
     for(; j<num[i]; j *= 10);

или так : while(j<num[i]) j*=10;

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