2009-07-27 10 views
-5

Je veux séparer les entiers en leurs facteurs. Par exemple, si le nombre total d'enregistrements est:Comment factoriser les entiers en utilisant 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) 

Quand il est plus que 10k - Je veux que tout le 1000 Quand il est plus que 100k - Je veux que tout le 10k

De cette façon, je veux pour factoriser le nombre. Comment y parvenir? Existe-t-il un module Perl disponible pour ce type d'opérations numériques?

Supposons que le nombre total d'enregistrements est 10k. Il devrait être divisé par 1000x10 fois seulement; pas par 100 ou 10s.

Je peux utiliser la fonction sqrt. Mais ce n'est pas toujours ce à quoi je m'attends. Si je donne l'entrée 146, je dois obtenir (73, 2).

+1

OP a beaucoup de fautes d'orthographe/grammaticales. –

+0

raison de downvote? – joe

+0

J'ai changé et réparé un peu quoi. – joe

Répondre

5

Vous pouvez utiliser les mêmes algorithmes que vous trouvez pour d'autres langages en Perl. Il n'y a pas de magie spéciale Perl dans les idées. C'est juste l'implémentation, et pour quelque chose comme ce problème, ça va probablement ressembler à l'implémentation dans n'importe quel langage.

Quel problème tentez-vous de résoudre? Peut-être pouvons-nous vous diriger vers le bon algorithme si nous savons ce que vous essayez de faire:

  • Pourquoi les nombres supérieurs à 10 000 utilisent-ils le facteur 1 000? La plupart des nombres n'auront pas un facteur de 1000.
  • Voulez-vous tous les facteurs, ou seulement le plus grand et son compagnon?
  • Que voulez-vous dire que la fonction sqrt ne fonctionne pas comme prévu? Si vous suivez l'algorithme commun, il vous suffit de parcourir jusqu'à la racine carrée pour tester les facteurs. La plupart des nombres entiers n'ont pas de racine carrée intégrale.
2

Si le nombre n'est pas un nombre premier, vous pouvez utiliser un algorithme de factorisation.

Il est un exemple d'une telle fonction ici: http://www.classhelper.org/articles/perl-by-example-factoring-numbers/factoring-numbers-with-perl.shtml

+0

Même si un nombre est premier, vous pouvez utiliser un algorithme d'affacturage. Vous n'avez tout simplement pas de facteurs supplémentaires. :) –

+0

C'est vrai, mais alors le résultat serait juste 1 x N, ce que je pensais n'est pas trop utile à l'affiche originale :). –

1

boucle à travers quelques chiffres communs dans une plage acceptable (par exemple, 9 à 15), calculer le reste modulo votre numéro de test et choisissez le plus bas.

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]; 
} 
Questions connexes