Я написал эту функцию для подсчета и возврата количества цифр или длины числа, переданного функции. Он прекрасно работает, пока вы не скажете ему считать цифры в числе более чем из 10 цифр. В этих случаях он просто возвращает 1.
int digits(int z)
{
int counter = 1;
for ( double y = 9; z > y; y = (y*10) + 9)
{
counter++;
}
return counter;
}
Целое число, скорее всего, 32 бита на вашей целевой машине. Если подписано, целое число содержит значение от (примерно) -2 млрд до +2 млрд. Любой экстремум имеет длину 10 цифр.
Вы можете изменить свой код для работы с 64-битными целыми числами, чтобы увеличить пробег. В противном случае вам нужно будет использовать пользовательское представление (т. Е. Написать собственный большой класс целых чисел), чтобы разрешить произвольно большие числа.
Диапазон 4 байтов от –2,147,483,648
в 2,147,483,647
Если вы укажете любое положительное число меньше, чем 2 147 483 647, оно будет засчитано, иначе вернется 1.
Я думаю, что вы должны проверить диапазон.
что касается Int это -От 2 147 483 648 до 2 147 483 647
Любое число меньше нижнего предела, т.е. -2 147 483 648, или что-либо больше верхнего предела, то есть 2 147 483 647, в результате даст 1. Это вы указали в вопросе.
кликните сюда для деталей.
У вас есть проблемы в вашем коде:
По адресу 1 .:
Вам нужно абсолютное значение: int u = std :: abs (z).
Внимание: абсолютное значение наиболее отрицательного целого числа не определено.
По адресу 2 .:
Увеличьте счетчик и уменьшите u, если 10 <= ты После этого вы можете использовать свой цикл с int y и u.
Кроме того: Скорее всего, тест, который вы выполняете, проходит отрицательное число из-за переполнения при умножении на 10.