как развернуть число?
#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 шт):
В данном случае решать можно по разному обе ваши догадки по сути верны. Возможно проще создать массив который потом развернуть. Но я приведу пример случая как-то начать проверку не с конца
#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, но это можно было бы сделать и через условие.
Короткий вариант с использованием символьного массива.
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;
}
Вот способ печати в правильном порядке без массива
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;
}
Он обеспечивает правильную печать отрицательных чисел, преобразуя их в беззнаковые.