
![]() |
![]() ![]() |
![]() |
Диона |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 14 Пол: Женский Репутация: ![]() ![]() ![]() |
Подскажите алгоритм подсчёта количества цифр целого числа. Никак не получается разобраться.
![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Целочисленное деление на 10 (и подсчет количества делений) до тех пор, пока делимое не станет равно 0.
|
Valery |
![]()
Сообщение
#3
|
Группа: Пользователи Сообщений: 4 Пол: Мужской Реальное имя: Valery Репутация: ![]() ![]() ![]() |
В другой теме встречался и такой вариант:
преобразуешь число в текстовую строку и узнаешь ее длину стандартной функцией. |
andriano |
![]()
Сообщение
#4
|
Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: ![]() ![]() ![]() |
Вариант с делением неверен: на числе 1000 он даст 1 цифру вместо 4.
Вывод: раз речь идет о десятичном представлении, то именно в таком редставлении и надо делать, т.е. единственный разумный вариант - преобразование в строку. |
Lapp |
![]()
Сообщение
#5
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Вариант с делением неверен: на числе 1000 он даст 1 цифру вместо 4. ![]() Будь добр, подтверди свои слова программным кодом. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
С 1000 все будет в порядке, насколько я понимаю, а вот как правильно заметил andriano (не здесь, на другом форуме) - при 0 будет-таки сбой...
|
Lapp |
![]()
Сообщение
#7
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Определение количества цифр через строку - это обман.. Просто тем самым работа перекладывается на готовые паскалевские процедуры (которые работают, скорее всего, именно делением). И если будет задача определения количества цифр в другой системе отсчета, то этот метод просто не работает.
Добавлено через 2 мин. Какой сбой?.. n:= 0; -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
len4ik |
![]()
Сообщение
#8
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Женский Реальное имя: Ленка Репутация: ![]() ![]() ![]() |
а вот такой код, как вам ( я правда в паскале не очеь, тока изучаю);
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 |
![]()
Сообщение
#9
|
Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: ![]() ![]() ![]() |
![]() Будь добр, подтверди свои слова программным кодом. Прошу прошения, тут у меня произошел какой-то сбой. Тем не менее, родолжаю утверждать, что именн способ через преобразование в строку и является единственно правильным. В принципе можно оценить плюсы и минусы таких способов. Плюсы "строки": - делает именно то, что нужно. Т.е. запись соответствует условию задачи. - текст короче. Соответственно, легче написание, отладка и сопровождение. - не требует доказательства того, что "арифметический" вариант эквивалениен "переводу в строку". И, думаю, именно это является ОСНОВНЫМ преимуществом данного метода. Строгое математическое доказательство получится довольно объемным, причем его прийдется сначала провести разработчику, а затем КАЖДЫЙ РАЗ при смене того, кто будет осуществлять сопровождение кода. Плюсы "арифметического" варианта: - вычислительно менее ресурсоемок. - легко обобщается на любую систему счисления. В принципе у "арифметического" способа есть ОЧЕНЬ существенный недостаток - к нему неприменим один из основнях принципов ПРАВИЛЬНОГО программирования: "неправильный код должен выглядеть неправильно". PS. Да, самое серьезное замечание против "строки" - трудность обобщения на случай другого основания. Правильный путь при этом окажется более ресурсоемким, чем в противном случае: 1. Написание процедуры перевода числа в строку в нужной (или произвольной) системе счисления. 2. Воспользоваться этой процедурой. Примечание: отладку обеих частей производить, естественно, независимо. PPS. Насчет "перекладывания на "готовые паскалевсекие процедуры": Если мы в 16-разрядном BP делим longint на longint, неужели мы обязаны вместо оператора деления явно программировать целиком весь алгоритм деления в столбик? Сообщение отредактировано: andriano - |
![]() ![]() |
![]() |
Текстовая версия | 30.09.2023 0:15 |