Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подсчет количества цифр в числе 
V
    Опции темы
Magnetto
Дата 20.9.2007, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 1.2.2007
Где: Ukraine

Репутация: нет
Всего: нет



Добрый вечер...

хотел обратиться за помощью...

допустим есть у меня число в переменной Real (или любой другой , которая позволяет записывать числа с точкой)...мое задание - подсчитать количество цифр этого числа...

было решение написать такой код

Код

var 
 a : real
 i : byte
 s : longint
  Begin
    While trunc(a) <> a do
      Begin
        a := a * 10 ;
      End;
    s := trunc(a) ;
    While s > 0 do
      Begin
       s := s div 10 ;
       i := i + 1 ;
      End;
  End.


в данном коде число будет умножатся до тех пор пока не исчезнет точка , что позволит нам получить целое число с сохранением всех цифр числа , для подальшего их подсчета(второй цикл)....но тут есть другая заминка...trunc преобразует число в integer..и это означает что числа  выше пяти символов или ~32000 при переумножении уже не пройдут , т.к банально будет неправильный подсчет , в чем я и переубедился при отладке данного кода....

кто может посоветовать другой метод подсчета цифр в числе или с помощью чего можно подсчитать числа выше грани integer?

благодарю
PM MAIL WWW ICQ   Вверх
volvo877
Дата 20.9.2007, 23:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(Magnetto @  20.9.2007,  20:52 Найти цитируемый пост)
trunc преобразует число в integer

С чего бы это? Функция Trunc возвращает LongInt, но вот используешь ты ее неправильно... Никогда Trunc(X) не будет равно X, если переменная X не целочисленная...

Вариант первый:

Код

{$n+}
var
  a: double; { Это для увеличения точности, с типом Real программа работать не будет }
  i: byte;
  s: longint;

begin
  a := 11234.0495;
  repeat
    a := a * 10 ;
    s := trunc(a);
  until abs(frac(a)) < 0.0001;

  while s > 0 do begin
    s := s div 10;
    i := i + 1;
  end;
  writeln(i);
end.


Не сработает, если итоговое число не будет помещаться в LongInt. Тогда работаем по варианту №2:
Код


{$n+}
var
  a: double;
  i: byte;
  s: string;

begin
  a := 11234.0495;
  str(trunc(a), s);

  repeat
    s := s + chr(48 + trunc(10 * frac(a)));
    a := a * 10 ;
  until abs(frac(a)) < 0.0001;

  writeln(length(s));
end.

(если нигде не ошибся - должно отработать...)
PM MAIL   Вверх
Magnetto
Дата 21.9.2007, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 1.2.2007
Где: Ukraine

Репутация: нет
Всего: нет



благодарю...


мне нужна была только идея , дальше сам буду разбираться в двух вариантах....

спс...

Это сообщение отредактировал(а) Magnetto - 21.9.2007, 07:24
PM MAIL WWW ICQ   Вверх
greenpc
Дата 21.9.2007, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 29.1.2007

Репутация: нет
Всего: нет



Magnetto
Код

var
  a: double;
  s: string;
begin
  a:= 1234.2;
  s := FloatToStr(a);
  s := StringReplace(s, DecimalSeparator,'',[]);
  Writeln(Length(s));
end;


PM   Вверх
Skladnoy
Дата 21.9.2007, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 13.9.2007

Репутация: нет
Всего: нет



Цитата(Magnetto @  20.9.2007,  21:52 Найти цитируемый пост)

допустим есть у меня число в переменной Real (или любой другой , которая позволяет записывать числа с точкой)...мое задание - подсчитать количество цифр этого числа...

А как вообще следукт понимать количство цифр в числе с плавающей точкой? К примеру, сколько там значащих цифр? 
PM MAIL   Вверх
Magnetto
Дата 21.9.2007, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 1.2.2007
Где: Ukraine

Репутация: нет
Всего: нет



greenpc , да..я сделал ошибку , забыв указать компилятор...

Tubro Pascal v7.0...если бы в нем был FloatTostr этого топа не было бы даже...


благодарю еще раз , volvo877 , программа отлажена...все работает =)
PM MAIL WWW ICQ   Вверх
Magnetto
Дата 22.9.2007, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 1.2.2007
Где: Ukraine

Репутация: нет
Всего: нет



Skladnoy

именно в бп , тп это не так легко реализуемо относительно того же делфи , где вся задача состоит из
Код

 var 
   i := real ;
   s := string ;
   a : byte ;
    Begin
     s := floattostr(i) ;
     a := length(s) - 1 ;
    End.


в бп и тп чуть по другому реализация идет...поэтому у меня получилась заминка...

ну вот допустим есть число 123,321...в этом числе 6 цифр...11,198 - пять...и т.д..

з.ы тему можно закрывать..програмулька сделана...
PM MAIL WWW ICQ   Вверх
Skladnoy
Дата 22.9.2007, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 13.9.2007

Репутация: нет
Всего: нет



Цитата(Magnetto @  22.9.2007,  12:38 Найти цитируемый пост)

ну вот допустим есть число 123,321...в этом числе 6 цифр...11,198 - пять...и т.д..

А в 1.0 / 3.0 сколько? 
PM MAIL   Вверх
volvo877
Дата 22.9.2007, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(Skladnoy @  22.9.2007,  19:58 Найти цитируемый пост)
А в 1.0 / 3.0 сколько?  

12 если используется Real и 16 - если Double... Больше разрядность не позволит... Еще вопросы есть, или уже перестанешь глупостями заниматься? Автор, если ты не успел заметить в своем рвении запостить ответ, пометил вопрос как решенный.

Или обязательно тему закрыть надо? 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0794 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.