Получить количество цифр номера

У меня есть такой номер:int num = 36729; и я хочу получить количество цифр, составляющих число (в данном случае 5 цифр).

Как я могу это сделать

 user711604 июн. 2012 г., 20:42
 JAB04 июн. 2012 г., 22:35
@ sixlettervariables Это не столько дубликат с точки зрения намерения, но с точки зрения содержания, который я определенно скажу, учитывая, что сам вопрос дает именно те ответы, которые хотел Ник.

Ответы на вопрос(8)

/ и% операторы.

 wberry04 июн. 2012 г., 22:36
Тебе понадобится только% если вам также нужен список значений цифр.
 Nick04 июн. 2012 г., 21:05
Как? Не могли бы вы привести пример с использованием%?
int unsigned_digit_count(unsigned val) {
    int count = 0;
    do {
        count++;
        val /= 10;
    } while (val);
    return count;
}

int digit_count(int val) {
    if (val < 0) {
        return 1+unsigned_digit_count(-val); // extra digit for the '-'
    } else {
        return unsigned_digit_count(val);
    }
}
 Nick05 июн. 2012 г., 14:40
Спасибо за ответ + 1
Решение Вопроса

Используйте эту формулу:

if(num)
  return floor(log10(abs((double) num)) + 1);

return 1;
 gliderkite04 июн. 2012 г., 20:52
@ amit См. правку.
 amit04 июн. 2012 г., 20:45
Это также не работает дляnum == 0 (и снова для каждогоnum <=0) - хотя я восхищаюсь элегантностью использованияlog. Если можно предположить,num > 0 Сомневаюсь, что есть более элегантное решение. В любом случае - это можно легко исправить как препроцесс
 amit04 июн. 2012 г., 21:05
Вы получили мой +1 после этого редактирования. Элегантный. Обратите внимание, что дляnum < 0 (если возможно) вы можете умножить на -1 перед тем, как взять log10, (и добавить 1, если знак - также должен учитываться).
 Steve Jessop04 июн. 2012 г., 22:40
Для крайних случаев, когда это не работает - еслиdouble не способен точно представлять каждое значениеint, тогда ваш ввод может быть округлен доlog10 и дать неправильный ответ. Конечно, 64-битный IEEE double может представлять каждое значение 32-битногоint точно, так что это не относится ни к одной нормальной реализации C. При условии, что вход является точным, когда это сила 10log10 должен (как вопрос QoI) дать точный результат. Но стандарт C не говорит, насколько точны математические операции, поэтому если бы он выдавал результат1.9999999 -ish для ввода100.0, тогда ты снова попал в беду.
 Steve Jessop04 июн. 2012 г., 22:54
Я, наверное, должен был сказать «гипотетические крайние случаи», просто двойная математика, в которой действительно важно, получился ли результат немного, вызывает у меня панику. В этом случаеfloor создает ошибочную ошибку, если результат немного ниже истинного значения, которое в значительной степени является определением крайне нестабильных численных вычислений. Но достаточно легко проверить любую данную реализацию, чтобы убедиться, что результат никогда не будет немного низким.

Ты не можешь сделать это?

    int num = 36729;
    num.ToString().Length
 nategoose04 июн. 2012 г., 22:50
Это C #, Java и, возможно, C ++ / CLI, но это не C

Неэффективно, но странно элегантно ...

#include <stdio.h>
#include <string.h>

int main(void)
{
    // code to get value
    char str[50];
    sprintf(str, "%d", value);

    printf("The %d has %d digits.\n", value, strlen(str));

    return 0;
}
 Steve Jessop04 июн. 2012 г., 22:42
При условии, что у вас есть C99-совместимыйsnprintf (то есть не от Microsoft_snprintf), его возвращаемое значение равно количеству необходимых символов. Таким образом, вы можете сохранить отдельный звонок наstrlen и сделать это в одну строку:return snprintf(0, 0, "%d", value);.
 JAB04 июн. 2012 г., 22:46
@ SteveJessop О, это хороший совет.
int digits = 0;
while (num > 0) {
  ++digits;
  num = num / 10;
}
 Paulpro04 июн. 2012 г., 21:44
@ amit 0 - правильный ответ дляn == 0. Вы бы не сказали00050 имеет 5 цифр, имеет 2. Аналогично0 не имеет цифр.
 amit04 июн. 2012 г., 20:46
Да, никогда не говорил, что это не выполнимо, просто нужно обрабатывать вручную:)
 Emil Vikström04 июн. 2012 г., 20:45
amit, хорошая мысль. Вы можете обработать 0 и отрицательные числа перед этим фрагментом (отрицательные числа также зависят от того, если- char считается "цифрой").
 amit04 июн. 2012 г., 21:53
@ PaulP.R.O .: Я не согласен с конкретным случаем 0, но думаю, это зависит от определения.
 amit04 июн. 2012 г., 20:42
Обратите внимание, что это не удается дляnum == 0, этот случай должен быть обработан вручную. На самом деле для всехnum <= 0 ответ будет 0 .. Конечно, это не проблема, если можно предположитьnum > 0

отличного от 0, вычислите логарифм по основанию-10 абсолютного значения ввода, возьмите пол этого результата и добавьте 1:

int dig;
...
if (input == 0)
  dig = 1;
else
  dig = (int) floor(log10(abs((double) input))) + 1;

0 является особым случаем и должен обрабатываться отдельно.

int findcount(int num) 
{ 
    int count = 0; 
    if(num != 0){
      while(num) { 
          num /= 10; 
          count ++; 
      } 
      return count ; 
    }
    else
      return 1;
} 
 Paulpro04 июн. 2012 г., 21:43
Не могу0 имеет 0 цифр. Вы бы не сказали00050 имеет 5 цифр, имеет 2.
 gliderkite04 июн. 2012 г., 21:08
Еслиnum является0 количество цифр равно1.
 JAB04 июн. 2012 г., 21:56
@ PaulP.R.O.00050 а также50 имеют то же значение, но0 и `` нет.
 Jainendra04 июн. 2012 г., 21:18
Как объяснил АмитВо условие дляnum ==0 будет обработан вручную.
 Paulpro04 июн. 2012 г., 22:02
@ JAB Не они?0 это просто математическое представлениеnil. Это отсутствие количества. Я думаю, что вы думаете о0 в виде строки, а не фактического значения, которое оно представляет.

Ваш ответ на вопрос