Как удалить начальные нули из целого числа, сгенерированного циклом, и сохранить его в виде массива?

У меня есть цикл for, генерирующий целые числа.

Например:

for (int i=300; i>200; i--)
    {(somefunction)*i=n;
    cout<<n;
    }

Это производит вывод на экран, как это:

f=00000000000100023;

Я хочу сохранить часть 100023 этого числа (т.е. просто игнорировать все нули до того, как начнутся ненулевые числа, но затем сохранить нули, которые следуют) в виде массива.

Так:

array[0]=1;
array[1]=0;
array[2]=0;
array[3]=0;
array[4]=2;
array[5]=3;

Как мне добиться этого?


person user103572    schedule 18.05.2009    source источник
comment
Если ваше число хранится как целое число f, оно не будет сохранено как f=0000000... что угодно. Целые числа не хранят ведущие нули.   -  person Paul Sonier    schedule 18.05.2009
comment
дубликат: stackoverflow.com/questions /515612/   -  person lothar    schedule 19.05.2009
comment
@lothar-поскольку вопрос отличается тем, что он предлагает, я не считаю его дубликатом   -  person TStamper    schedule 19.05.2009
comment
@McWafflestix: Извините, что был ярым фанатиком. но целое число БУДЕТ храниться с ведущими нулями, потому что независимо от значения оно будет использовать все 32 бита памяти независимо от числового значения. Конечно, вы совершенно правы в том, что строковое представление этого целого числа по умолчанию не будет отображать начальные нули, что делает мою придирку спорной.   -  person JohnFx    schedule 19.05.2009
comment
У вас есть впечатляющий компилятор, если он может решить (somefunction)*i=n; но я думаю, что это скорее опечатка.   -  person Max Lybbert    schedule 19.05.2009


Ответы (5)


Это мешанина ответов, потому что они все есть, я просто не думаю, что вы видите решение.

Во-первых, если они являются целыми числами Ответ Билла вместе с другими ответами великолепны, за исключением того, что некоторые из них пропускают часть "хранить в массиве". Кроме того, как указано в комментарии к вашему вопросу, эта часть является дубликатом< /а>.

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

std::vector<int> digits;
bool inNumber = false;

for (int i=300; i>200; i--)    
{
    int value = (somefunction) * i;

    if (value != 0)
    {
        inNumber = true; // its not zero, so we have entered the number
    }

    if (inNumber)
    {
        // this code cannot execute until we hit the first non-zero number
        digits.push_back(value);
    }
}

По сути, просто не начинайте нажимать, пока не достигнете фактического числа.

person GManNickG    schedule 18.05.2009

В свете отредактированного вопроса мой первоначальный ответ (ниже) не самый лучший. Если вам абсолютно необходимо иметь выходные данные в массиве вместо вектора, вы можете начать с ответа GMan, а затем перенести полученные байты в массив. Вы можете сделать то же самое с ответом JohnFx, как только найдете первую ненулевую цифру в его результате.


Я предполагаю, что f имеет тип int, и в этом случае он не хранит начальные нули.

int f = 100023;

Для начала нужно найти нужную длину массива. Вы можете сделать это, взяв журнал (по основанию 10) f. Вы можете импортировать библиотеку cmath, чтобы использовать функцию log10.

int length = log10(f);
int array[length];

length теперь должно быть 6.

Затем вы можете удалить каждую цифру из f и сохранить ее в массиве, используя цикл и оператор модуля (%).

for(int i=length-1; i >= 0; --i)
{
    array[i] = f % 10;
    f = f / 10;
}

Каждый раз в цикле модуль берет последнюю цифру, возвращая остаток от деления на 10. Следующая строка делит f на 10, чтобы подготовиться к следующей итерации цикла.

person Community    schedule 18.05.2009
comment
счет, это отличный ответ, но я сделал ошибку, сказав, что число было целым числом. Прости! Спасибо за вашу помощь. - person user103572; 19.05.2009

Прямой путь был бы

std::vector<int> vec;
while(MyInt > 0)
{
  vec.push_back(MyInt%10);
  MyInt /= 10;
}

который хранит десятичные дроби в обратном порядке (вектор используется для упрощения моего кода).

person stefaanv    schedule 18.05.2009
comment
push_front было бы лучше, но я обычно использую push_back с векторами - person stefaanv; 18.05.2009

Подожди секунду. Если вы написали код, генерирующий целые числа, зачем парсить его обратно в массив?

Почему бы просто не втиснуть целые числа в массив в цикле?

int array[100];

for (int i=300; i>200; i--)    
{
    array[i]= (somefunction)*i;    
}
person JohnFx    schedule 18.05.2009
comment
необходимо избавиться от предыдущих нулей, так как требуемое число будет иметь значение только в том случае, если это правильный порядок, надеюсь, что это поможет - person user103572; 19.05.2009
comment
Я все еще думаю, что это сработает. Ведущие нули в целом числе просто логические. Если они появляются из вашего программирования, это просто проблема форматирования, а не проблема хранения. На самом деле, требуется ДОПОЛНИТЕЛЬНАЯ работа, чтобы ведущие нули отображались таким образом. Код, который вы указали в исходном вопросе, не даст описанного вами результата. - person JohnFx; 19.05.2009
comment
Посмотрев еще раз на ваш код, я думаю, что вы можете спутать то, что отображает cout и что на самом деле хранится. У вас может быть, например, setfill('0') где-то в коде, который будет дополнять число при печати через COUT. - person JohnFx; 19.05.2009
comment
@ noob09: Я бы просто сделал то, что здесь есть у JohnFX, затем перебрал массив в конце, чтобы найти первую ненулевую цифру, получил из нее размер результата, а затем скопировал оставшиеся цифры в новый массив. - person Bill the Lizard; 19.05.2009
comment
Зачем перебирать массив? В конце кода, который я разместил, @noob09 должен получить окончательный результат, который он искал, без дополнительной работы. - person JohnFx; 19.05.2009
comment
@JohnFx: в вашем массиве будут все 100 цифр, включая ведущие нули. Дополнительный цикл заключается в том, чтобы найти первую ненулевую цифру и вернуть остаток массива. - person Bill the Lizard; 19.05.2009
comment
Я предполагал, что (somefunction) возвращает целое число. Вы думаете, он имел в виду, что он вернул один символ? - person JohnFx; 19.05.2009

Поскольку начальные нули не сохраняются, поскольку они представляют одно и то же число

См.: преобразование целого числа в массив

person TStamper    schedule 18.05.2009