2009-07-27 2 views
-5

Я хочу разделить целые числа на свои факторы. Например, если общее количество записей:Как преобразовать целые числа с помощью Perl?

169 - (13 x 13 times) 
146 - (73 x 2 times) 
150 - (50 x 3 times) 
175 - (25 x 7 times) 
168 - (84 x 2) 
160 - (80 x 2 times) 

Когда это больше, чем 10k - Я хочу, чтобы все на 1000 Когда это больше, чем 100k - Я хочу, чтобы все на 10k

Таким образом, я хочу чтобы умножить число. Как достичь этого? Есть ли какой-либо модуль Perl для этих видов числовых операций?

Предположим, что общее количество записей 10k. Он должен быть разбит только на 1000x10 раз; не на 100 или 10 секунд.

Я могу использовать sqrt функция. Но это не всегда то, чего я ожидаю. Если я дам вход 146, я должен получить (73, 2).

+1

ОП имеет много орфографических/грамматических ошибок. –

+0

причина для downvote? – joe

+0

Я кое-что изменил и исправил. – joe

ответ

5

Вы можете использовать эти алгоритмы для других языков в Perl. В идеях нет никакой особой магии Perl. Это просто реализация, и для чего-то подобного эта проблема, вероятно, будет очень похожа на реализацию на любом языке.

В чем проблема, которую вы пытаетесь решить? Может быть, мы можем указать вам на правильный алгоритм, если мы знаем, что вы пытаетесь сделать:

  • Почему цифры более 10 000 используют фактор 1000? В большинстве номеров не будет 1000 факторов.
  • Вы хотите, чтобы все факторы, или просто самые большие и его спутники?
  • Что значит, что функция sqrt не работает так, как вы ожидаете? Если вы следуете общепринятому алгоритму, вам просто нужно итерации до пола квадратного корня, чтобы проверить факторы. Большинство целых чисел не имеют интегрального квадратного корня.
2

Если число не является простым, вы можете использовать алгоритм факторинга.

Существует пример такой функции здесь: http://www.classhelper.org/articles/perl-by-example-factoring-numbers/factoring-numbers-with-perl.shtml

+0

Даже если число является простым, вы можете использовать алгоритм факторинга. У вас просто нет дополнительных факторов. :) –

+0

Это правда, но тогда результат будет всего 1 x N, который, как я думал, не слишком полезен для оригинального плаката :). –

1

Loop через несколько общих чисел в приемлемом диапазоне (например, от 9 до 15), вычислить остаток по модулю свой номер теста, и выбрать самый низкий.

sub compute_width { 
    my ($total_records) = @_; 
    my %remainders; 
    for(my $width = 9; $width <= 15; $width += 1) { 
     my $remainder = $total_records % $width; 
     $remainders{$width} = $remainder; 
    } 
    my @widths = sort { 
     $remainders{$a} <=> $remainders{$b} || 
     $a <=> $b 
    } keys %remainders; 
    return $widths[0]; 
} 
Смежные вопросы