Как узнать длину числа c
Перейти к содержимому

Как узнать длину числа c

  • автор:

Количество цифр

Время от времени перед программистом стает задача нахождения количества цифр в числе. Есть много способов решения этой задачи. В статье мы рассмотрим наиболее популярные из них.

Длина строки

Это очень простой вариант определения количества цифр, заключается в переводе числа в строковое представление с последующим определением длины строки.

public int CountDigitByString(int n) < return Math.Abs(n).ToString().Length; > 

Такой метод компактный и интуитивно понятный, однако он сильно проигрывает в быстродействии другим вариантам.

Десятичный логарифм

Использование десятичного логарифма для определения количества цифр в числе, позволяет производить вычисление за линейное время.

public int CountDigitsByLog10(int n) < return (n == 0) ? 1 : (int)Math.Log10(Math.Abs(n)) + 1; > 

Сравнение

Самый быстрый из приведенных методов.

private static readonly int[] Numbers = new [] < 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 >; public int CountDigitsByCompare(int n) < n = Math.Abs(n); for (var i = 0; i < Numbers.Length; i++) < if (n < Numbers[i]) < return i + 1; > > return 10; > 

Деление нацело

С использованием цикла

public int CountDigitsByDiv(int n) < var count = (n == 0) ? 1 : 0; while (n != 0) < n /= 10; count++; > return count; > 

Рекурсивно

public int CountDigitsByDivRecursive(int n) < return (n 9) ? 1 : CountDigitsByDivRecursive(n / 10) + 1; > 

Разбивка числа на отдельные цифры

Разбив число на отдельные цифры, мы получаем возможность нахождения:

  • количества цифр;
  • количества четных и нечетных;
  • количества различных(уникальных) цифр числа;
  • суммы цифр числа.
public Listint> IntToDigit(int n) < n = Math.Abs(n); var digits = new Listint>(); while (n > 0) < int digit = n % 10; n /= 10; digits.Add(digit); > return digits; > 

Количество четных

public int EvenCount(int n) < var digits = IntToDigit(n); var count = 0; foreach (var d in digits) < if (d % 2 == 0) < count++; >> return count; > //сокращенная форма записи с использованием Linq public int EvenCountLinq(int n) < return IntToDigit(n).Count(x => x % 2 == 0); > 

Количество нечетных

public int OddCount(int n) < var digits = IntToDigit(n); var count = 0; foreach (var d in digits) < if (d % 2 != 0) < count++; >> return count; > public int OddCountLinq(int n) < return IntToDigit(n).Count(x => x % 2 != 0); > 

Количество различных цифр в числе

public int CountUniqueDigits(int n) < var a = new int[9]; foreach (var d in IntToDigit(n)) < a[d]++; >var countUnique = 0; foreach (var x in a) < if (x > 0) < countUnique++; >> return countUnique; > 

Сумма цифр числа

public int SumDigits(int n) < var sum = 0; foreach (var d in IntToDigit(n)) < sum += d; >return sum; > //использование Linq сокращает запись public int SumDigitsLinq(int n) < return IntToDigit(n).Sum(); > 

Как узнать длину числа c

Если это реквизит справочника с назначеным типом. Т.е. в справочнике изначально он «неопределенный», затем при заполнении ему призваивается тип (Строка/Число). Со строкой все понятно, а вот как определить размерность числового реквизита.
Это все нужно для копирования элементов справочников с подчиненными элементами.

(0)+
Длину и точность естественно.

Извращением типа:
СтрЗначение = Строка(Значение);
Длина = СтрДлина(СтрЗначение);
Точность = Длина — Найти(СтрЗначение, «.»);

точнее
ПозицияТочки = Найти(СтрЗначение, «.»);
Точность = ?(ПозицияТочки = 0, 0, Длина-ПозицияТочки);

(+2) Длина = СтрДлина(СтрЗначение) — 1;
так думаю будет более правильнее

(2)
Это ты определил размер числа. А в (0) нужен размер числового реквизита для НазначитьТип(). Т.е. число может быть = 1, соответственно его длина=1, точность=0, но сам реквизит имеет размерность 12.2 вот эту размерность и нужно получить.

А вот у ТМ — 18″. точность. в диаметре
(5) лень искать, а навскидку не помню. Но можно.
(0) Хочешь функцию обратную к НазначитьТип(<ИмяРеквизита>, , , ) ?
(4) Длина числа по метаданным включает в себя разделетель

(7)
Спасибо за то что попытался 😉

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

(11)
Проблемы и с точностью и с длиной
Вопрос можно сократить: «Как определить длину»

(12) Видимо придется делать по ситуации — менять тип (точностть) непосрелственно перед передачей значения — ведь у значения точноть легко узнать.

(14)
Выкрутиться в справочнике это не проблема, просто хотелось бы сделать универсальное решение.

А может так попробовать

procedure Make()
sprNew = createobject(«reference.New»);
sprNew.New();
sprNew.SetType(«NewAttribut», «number», 10, 3);
sprNew.NewAttribut = 9999999999999999999999999999.9999999999999999999999999999;
Len = strlen(string(sprNew.NewAttribut));
PosPoint = find(string(sprNew.NewAttribut), «.»);
Precision = ?(PosPoint = 0, 0, Len — PosPoint);
message(«Длина — » + string(Len));
message(«Точность — » + string(Precision));
endprocedure

Как узнать длину числа в java

Самый простой способ узнать длину числа в Java – это вариант решения через строки. Нужно преобразовать число в строку и узнать длину строки. Рассмотрим на примере:

var num = 234; var length = String.valueOf(num).length(); System.out.println(length); // => 3 

Как определить длину числа с нуля?

Нужно, чтоб программа понимала, что пользователь вводит 01 или 02, а не 1 или 2.

  • Вопрос задан более трёх лет назад
  • 1148 просмотров

Комментировать

Решения вопроса 1

̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻

std::string str; std::getline(std::cin, str); std::cout 

Ответ написан более трёх лет назад

Комментировать

Нравится 1 Комментировать

Ответы на вопрос 1

Therapyx

Data Science

Программа и так поймет, что 01 это 1. Int числа хранятся в бинарном формате 1 = 0001, 2 = 0010, 3= 0011. 8 = 1111
Если же тебе надо просто выводить на экран имея первый ноль, то используй std::setwidth и std::setfill.

int digit = 1; std::cout 

или же второй вариант, принимать 01, 02, 03 типом string.

Ответ написан более трёх лет назад

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *