Помощь - Поиск - Пользователи - Календарь
Полная версия: Алгоритм подсчёта количества цифр
Форум «Всё о Паскале» > Разработка ПО, алгоритмы, общие вопросы > Алгоритмы
Диона
Подскажите алгоритм подсчёта количества цифр целого числа. Никак не получается разобраться. blink.gif
volvo
Целочисленное деление на 10 (и подсчет количества делений) до тех пор, пока делимое не станет равно 0.
Valery
В другой теме встречался и такой вариант:
преобразуешь число в текстовую строку и узнаешь ее длину стандартной функцией.
andriano
Вариант с делением неверен: на числе 1000 он даст 1 цифру вместо 4.
Вывод: раз речь идет о десятичном представлении, то именно в таком редставлении и надо делать, т.е. единственный разумный вариант - преобразование в строку.
Lapp
Цитата(andriano @ 1.12.2007 22:54) *

Вариант с делением неверен: на числе 1000 он даст 1 цифру вместо 4.

blink.gif ?????????????
Будь добр, подтверди свои слова программным кодом.
volvo
С 1000 все будет в порядке, насколько я понимаю, а вот как правильно заметил andriano (не здесь, на другом форуме) - при 0 будет-таки сбой...
Lapp
Определение количества цифр через строку - это обман.. Просто тем самым работа перекладывается на готовые паскалевские процедуры (которые работают, скорее всего, именно делением). И если будет задача определения количества цифр в другой системе отсчета, то этот метод просто не работает.

Добавлено через 2 мин.
Какой сбой?..
n:= 0;
i:= 0;
repeat
n:= n div 10;
Inc(i)
until n=0;

len4ik
а вот такой код, как вам ( я правда в паскале не очеь, тока изучаю);

program o;
var a,b,i:integer;
begin

read(a);
i:=0;
while a>0 do
begin
a:=a div 10;
i:=i+1;
end;
write(i)
end.
andriano
Цитата(Lapp @ 1.12.2007 23:02) *

blink.gif ?????????????
Будь добр, подтверди свои слова программным кодом.

Прошу прошения, тут у меня произошел какой-то сбой.

Тем не менее, родолжаю утверждать, что именн способ через преобразование в строку и является единственно правильным.

В принципе можно оценить плюсы и минусы таких способов.

Плюсы "строки":
- делает именно то, что нужно. Т.е. запись соответствует условию задачи.
- текст короче. Соответственно, легче написание, отладка и сопровождение.
- не требует доказательства того, что "арифметический" вариант эквивалениен "переводу в строку". И, думаю, именно это является ОСНОВНЫМ преимуществом данного метода. Строгое математическое доказательство получится довольно объемным, причем его прийдется сначала провести разработчику, а затем КАЖДЫЙ РАЗ при смене того, кто будет осуществлять сопровождение кода.

Плюсы "арифметического" варианта:
- вычислительно менее ресурсоемок.
- легко обобщается на любую систему счисления.

В принципе у "арифметического" способа есть ОЧЕНЬ существенный недостаток - к нему неприменим один из основнях принципов ПРАВИЛЬНОГО программирования: "неправильный код должен выглядеть неправильно".

PS. Да, самое серьезное замечание против "строки" - трудность обобщения на случай другого основания. Правильный путь при этом окажется более ресурсоемким, чем в противном случае:
1. Написание процедуры перевода числа в строку в нужной (или произвольной) системе счисления.
2. Воспользоваться этой процедурой.
Примечание: отладку обеих частей производить, естественно, независимо.

PPS. Насчет "перекладывания на "готовые паскалевсекие процедуры":
Если мы в 16-разрядном BP делим longint на longint, неужели мы обязаны вместо оператора деления явно программировать целиком весь алгоритм деления в столбик?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.