Forum Webscript.Ru

Программирование => Perl => Тема начата: FANTAzeRus от 17 Ноября 2003, 15:23:47

Название: Perl vs Числа
Отправлено: FANTAzeRus от 17 Ноября 2003, 15:23:47
Имею: допустим число 43
Хочу: Получить число ближайшее(большее) 50

типа функции

$max=48;
my $HIGH=getHign($max);
Название: Perl vs Числа
Отправлено: ondr от 17 Ноября 2003, 15:50:59
Ты хоть сам то понял что написал?
Название: Perl vs Числа
Отправлено: FANTAzeRus от 17 Ноября 2003, 15:54:43
Так понятнее???

43-50
27-30
18-20
3-10
79-80
Название: Perl vs Числа
Отправлено: FANTAzeRus от 17 Ноября 2003, 15:55:35
т.е. нужно найти следующее большее число кратное 10
Название: Perl vs Числа
Отправлено: ondr от 17 Ноября 2003, 16:03:59
int($max/10)*10+10;
Название: Perl vs Числа
Отправлено: FANTAzeRus от 17 Ноября 2003, 16:55:05
Фсе получилось! Спасибо!
Название: Perl vs Числа
Отправлено: vladsu от 17 Ноября 2003, 20:55:42
Цитировать
ondr:
int($max/10)*10+10;

Если только в $max не число оканчиваюшееся на 0.
Название: Perl vs Числа
Отправлено: ondr от 18 Ноября 2003, 10:34:56
vladsu
Ты не знаешь как выполнить проверку?
Тебя это смущает?
Или тебе хочется пофлеймить?

Если ты знаешь вариант лучше, напиши его, и тебе будут благодарны, а такие посты, как твой, вызывают лишь негативную реакцию.
Название: Perl vs Числа
Отправлено: NeoNox от 18 Ноября 2003, 11:41:55
ondr ответил на поставленный вопрос абсолютно верно.
Тема закрыта.
Название: Perl vs Числа
Отправлено: Chs от 18 Ноября 2003, 15:05:16
NeoNox
Не прав,
до обсуждения floor и ceil не дошли.
FANTAzeRus
ondr
Рекомендую посмотреть что бы обойтись без лишних проверок.
Название: Perl vs Числа
Отправлено: NeoNox от 18 Ноября 2003, 15:57:05
Тему открыл.
Chs
Ок хочется услышать обоснование подгрузки POSIX в данном случае.
И еще раз напомню условие:
Цитировать
FANTAzeRus:
Имею: допустим число 43 Хочу: Получить число ближайшее(большее) 50
Название: Perl vs Числа
Отправлено: Chs от 18 Ноября 2003, 16:31:51
NeoNox
Цитировать

 хочется услышать обоснование подгрузки POSIX в данном случае.

Ну можно подгрузить всего одну функцию и если мне не изменяет память, то начиная с какойто версии перла POSIX подгружается автоматом.

А все это затем, что бы потом, когда вокруг этой программы нарастет еще не одна не разбираться в странной ошибке.:))
Название: Perl vs Числа
Отправлено: NeoNox от 18 Ноября 2003, 16:41:52
(пожимая плечами)There\'s More Than One Way To Do It! ;)
Кстати я не совсем уверен в автоматической загрузке POSIXа. Даже наоборот... Perl 5.8.0
Название: Perl vs Числа
Отправлено: vladsu от 19 Ноября 2003, 00:51:16
Цитировать
ondr:
вызывают лишь негативную реакцию.


Негативную реакцию вызывает Ваш пост, а я всего лишь хотел обратить внимание на "подводный камень"!

По теме:

use Math::Round qw(nhimult);

my $osn = 10;
my @a  = qw(1 4 5 9 1.1 1.12 10 10.00000001 19 -1 -1.1 -10);

print $_, " => ", nhimult($osn, $_),"\\n" for @a;


Хотя это частнай случай POSIX.
Название: Perl vs Числа
Отправлено: C++ от 19 Ноября 2003, 15:42:01
Можно сделать проще и без проверок :)

#!/usr/bin/perl
@digits=(1,12,14,23,49,55,20,70,92,56,31,49,80,900,782);
foreach $digit (@digits)
{
  print "$digit - ",round($digit),"\\n";
}
sub round
{
  return($_[0]-$_[0]%10+10*($_[0]%10!=0))
}

Значение перации $_[0]%10 можно сохранить в скаляре и заменить ее на этот скаляр.
Результат работы:

1 - 10
12 - 20
14 - 20
23 - 30
49 - 50
55 - 60
20 - 20
70 - 70
92 - 100
56 - 60
31 - 40
49 - 50
80 - 80
900 - 900
782 - 790
Название: Perl vs Числа
Отправлено: vladsu от 19 Ноября 2003, 16:40:16
Цитировать
C++:
Можно сделать проще и без проверок

1.1 ?
-1.1 ?
Название: Perl vs Числа
Отправлено: C++ от 19 Ноября 2003, 21:01:45
vladsu
Тоже самое, только передавать нужно целое число :)
На самом деле, речь шла только о натуральных числах, о рациональных и отрицательных числах не было сказано ни слова....

А если надо, чтобы отрицательные числа округлялись к меньшему десятку, то use roundABS :)


#!/usr/bin/perl
@digits=(-1.1,1.2,14.7,-23.5,49.5,-55.7,20.9,-70,-92,56,31,49,80);
print "Digit| rABS | ABS |\\n";
print "----- ------ -----\\n";
foreach $digit (@digits)
{
  printf("%5.1f|%6d|%5d|\\n",$digit,roundABS(int($digit)),round(int($digit)));
}
sub round
{
  return($_[0]-$_[0]%10+10*($_[0]%10!=0))
}
sub roundABS
{
  return($_[0]-$_[0]%10+10*($_[0]%10!=0)*($_[0]>0))
}



Digit| rABS | ABS |
----- ------ -----
 -1.1|   -10|    0|
  1.2|    10|   10|
 14.7|    20|   20|
-23.5|   -30|  -20|
 49.5|    50|   50|
-55.7|   -60|  -50|
 20.9|    20|   20|
-70.0|   -70|  -70|
-92.0|  -100|  -90|
 56.0|    60|   60|
 31.0|    40|   40|
 49.0|    50|   50|
 80.0|    80|   80|