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

1

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

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

@ sixlettervariables Это не столько дубликат с точки зрения намерения, но с точки зрения содержания, который я определенно скажу, учитывая, что сам вопрос дает именно те ответы, которые хотел Ник. JAB
Возможный дубликат количество цифр - какой метод наиболее эффективен? user7116

Ваш Ответ

8   ответов
9

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

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

return 1;
Это также не работает дляnum == 0 (и снова для каждогоnum <=0) - хотя я восхищаюсь элегантностью использованияlog. Если можно предположить,num > 0 Сомневаюсь, что есть более элегантное решение. В любом случае - это можно легко исправить как препроцесс amit
@ amit См. правку. gliderkite
Вы получили мой +1 после этого редактирования. Элегантный. Обратите внимание, что дляnum < 0 (если возможно) вы можете умножить на -1 перед тем, как взять log10, (и добавить 1, если знак - также должен учитываться). amit
Для крайних случаев, когда это не работает - еслиdouble не способен точно представлять каждое значениеint, тогда ваш ввод может быть округлен доlog10 и дать неправильный ответ. Конечно, 64-битный IEEE double может представлять каждое значение 32-битногоint точно, так что это не относится ни к одной нормальной реализации C. При условии, что вход является точным, когда это сила 10log10 должен (как вопрос QoI) дать точный результат. Но стандарт C не говорит, насколько точны математические операции, поэтому если бы он выдавал результат1.9999999 -ish для ввода100.0, тогда ты снова попал в беду. Steve Jessop
Я, наверное, должен был сказать «гипотетические крайние случаи», просто двойная математика, в которой действительно важно, получился ли результат немного, вызывает у меня панику. В этом случаеfloor создает ошибочную ошибку, если результат немного ниже истинного значения, которое в значительной степени является определением крайне нестабильных численных вычислений. Но достаточно легко проверить любую данную реализацию, чтобы убедиться, что результат никогда не будет немного низким. Steve Jessop
2
int digits = 0;
while (num > 0) {
  ++digits;
  num = num / 10;
}
Обратите внимание, что это не удается дляnum == 0, этот случай должен быть обработан вручную. На самом деле для всехnum <= 0 ответ будет 0 .. Конечно, это не проблема, если можно предположитьnum > 0 amit
amit, хорошая мысль. Вы можете обработать 0 и отрицательные числа перед этим фрагментом (отрицательные числа также зависят от того, если- char считается "цифрой"). Emil Vikström
Да, никогда не говорил, что это не выполнимо, просто нужно обрабатывать вручную:) amit
@ amit 0 - правильный ответ дляn == 0. Вы бы не сказали00050 имеет 5 цифр, имеет 2. Аналогично0 не имеет цифр. Paulpro
@ PaulP.R.O .: Я не согласен с конкретным случаем 0, но думаю, это зависит от определения. amit
1

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

Как? Не могли бы вы привести пример с использованием%? Nick
Тебе понадобится только% если вам также нужен список значений цифр. wberry
1
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);
    }
}
Спасибо за ответ + 1 Nick
0
int findcount(int num) 
{ 
    int count = 0; 
    if(num != 0){
      while(num) { 
          num /= 10; 
          count ++; 
      } 
      return count ; 
    }
    else
      return 1;
} 
Еслиnum является0 количество цифр равно1. gliderkite
Как объяснил АмитВо условие дляnum ==0 будет обработан вручную. Jainendra
Не могу0 имеет 0 цифр. Вы бы не сказали00050 имеет 5 цифр, имеет 2. Paulpro
@ PaulP.R.O.00050 а также50 имеют то же значение, но0 и `` нет. JAB
@ JAB Не они?0 это просто математическое представлениеnil. Это отсутствие количества. Я думаю, что вы думаете о0 в виде строки, а не фактического значения, которое оно представляет. Paulpro
0

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

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

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

0

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

#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;
}
При условии, что у вас есть C99-совместимыйsnprintf (то есть не от Microsoft_snprintf), его возвращаемое значение равно количеству необходимых символов. Таким образом, вы можете сохранить отдельный звонок наstrlen и сделать это в одну строку:return snprintf(0, 0, "%d", value);. Steve Jessop
@ SteveJessop О, это хороший совет. JAB
-1

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

    int num = 36729;
    num.ToString().Length
Это C #, Java и, возможно, C ++ / CLI, но это не C nategoose

Похожие вопросы