как развернуть число?

#include <iostream> 
#include <algorithm>
using namespace std;

int main()
{
int chislo;
int cifra;
cout << "chislo";
cin >> chislo;
while(chislo != 0)
{
    cifra = chislo % 10; 
    chislo /= 10; 
    if (cifra != 1)
    {cout << cifra ;}
}
}

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

if (cifra != 1)

cifra может помещаться в массив, а потом этот массив уже можно развернуть, или же как-то начать проверку не с конца

cifra = chislo % 10;
chislo /= 10;  

а с начала


Ответы (3 шт):

Автор решения: Daniil Loban

В данном случае решать можно по разному обе ваши догадки по сути верны. Возможно проще создать массив который потом развернуть. Но я приведу пример случая как-то начать проверку не с конца

#include <iostream> 
#include <algorithm>
using namespace std;

int main()
{
  int divider = 1;
  int number = 2136;
  int digit=0; 
  while(number / divider >= 10){
    divider *= 10;
  }
  while(divider > 0){
    digit = (number - number % divider) / divider;
    number -= digit * divider;
    divider /= 10;
    if (digit != 1)  cout << digit;
  }
} 

Вывод: 236

Этот код излишен тем что содержит целых 2 цикла while, но нам нужно как-то определить длину числа, чтобы найти первый делитель 1000, если бы мы вводили строку это сделать было бы проще (по длине строки), но тогда ее мы и могли бы обработать даже без операции деления

От первого цикла можно избавится использовав математические функции pov и log но для этого нужно будет подключить импорт <math> и использовать -lm флаг при компиляции:

#include <iostream> 
#include <algorithm>
#include <math.h>

using namespace std;

int main()
{
  int number = 2136;
  int divider = pow(10, (number == 0 ? 0: int(log10 (number))));
  int digit; 
  while(divider > 0){
    digit = number / divider;
    number -= digit * divider;
    divider /= 10;
    if (digit != 1)  cout << digit ;
  }
} 

В выражении pow(10, (number == 0 ? 0: int(log10 (number)))); мы смотрим не является ли число нулем, после чего берем десятичный логарифм числа иначе, возвращаем нулевую степень что в итоге сделает divider равным 1 для отображения 0, но это можно было бы сделать и через условие.

→ Ссылка
Автор решения: DmitryK

Короткий вариант с использованием символьного массива.

int main()
{
    int chislo = 61530;
    string str = to_string(chislo);

    for(int i=0; i<str.length(); i++)
        if(str[i] != '1')
            cout << str[i];

    return 0;
}

→ Ссылка
Автор решения: avp

Вот способ печати в правильном порядке без массива

  int n = 100500;  // we want to print this variable
  int u = 0;
  int k = 0;       // number of digits in `n`

  do {
    u = u * 10 + n % 10;
    k++;
  } while (n /= 10);

  // now we have in `u` our number in "reverse order"
  // using the same algorithm print the value of `n` in "normal order"
  
  for (int i = 0; i < k; i++) {
    printf("%d", u % 10);
    u /= 10;
  }
  puts("");

Если посмотреть на этот фрагмент внимательно, то в нем есть два существенных недостатка. 1) Он не работает с отрицательными числами; 2) в нем излишне много дорогих операций (деление и умножение).

Если упаковывать получаемые десятичные цифры в вспомогательную переменную по 4 бита на цифру, то количество делений можно оптимизировать, а от умножений вовсе избавиться. Единственный недостаток такого подхода -- некоторое логическое усложнение, т.к. возможен вариант, когда 2 цифры в эту переменную естественным образом не помещаются.

Впрочем, я думаю, сам код говорит больше, чем слова, поясняющие его.

  n = -2147483648;

  unsigned v = 0, nn = n;
  if (n < 0) {
    putchar('-');
    nn = -n;
  }

  // save lower digits in `v` (4 bits for one digit, maximum 8 digits)
  for (k = nn ? 0 : 1; k < 8 && nn; k++) {
    v = (v << 4) | (nn % 10);  // `v` used as stack, push reverse ordered digits to it
    nn /= 10;
  }

  if (k > 7) {
    if (nn > 9)
      putchar((nn / 10) + '0'); // print highest digit
    putchar((nn % 10) + '0');   // print other high digit
  }
  for (int i = 0; i < k; i++) {
    putchar((v & 0xf) + '0');   // print lower digits in correct order
    v >>= 4;                    // pop digit from our "stack"
  }
  putchar('\n');

Умозрительно, конечно, но такой код должен быть (на достойном проце -)) в разы эффективней предыдущего.

Кстати, обратите внимание на этот пролог

  unsigned v = 0, nn = n;
  if (n < 0) {
    putchar('-');
    nn = -n;
  }

Он обеспечивает правильную печать отрицательных чисел, преобразуя их в беззнаковые.

→ Ссылка