J'ai essayé d'utiliser Ruby pour voir s'il y a un nombre capreca dans un entier dans une certaine plage

Contexte

Jusqu'au lycée, j'étais le meilleur en mathématiques et j'adorais ça. Cependant, lorsque je suis entré dans une université d'arts libéraux, j'ai vécu une vie loin des mathématiques. Et cela fait 10 ans que je suis devenu membre de la société ... Je suis un ingénieur système qui n'a développé que le cerveau gauche, qui a oublié à la fois l'intégrale minute et la fonction triangulaire. Récemment, grâce à YouTube, j'ai progressivement augmenté mes chances d'entrer en contact avec les mathématiques. C'est le bon moment pour résoudre les questions d'examen d'entrée et n'hésitez pas à toucher le monde inconnu des mathématiques universitaires.

Aujourd'hui, à propos de l'entier "** nombre de Capreca **" avec des propriétés intéressantes présentées dans la vidéo suivante Nous vérifierons en utilisant Ruby.

Quel est le nombre de capreca?

Le nombre Kaprekar est un entier défini par l'un des éléments suivants:

  1. La valeur égale à la valeur d'origine lorsqu'elle est mise au carré et que la somme est divisée en partie avant et partie arrière.
  2. La valeur égale à la valeur d'origine lorsque la différence entre les chiffres maximum et minimum est prise en réorganisant les chiffres.

Source: Wikipedia

Cette fois, nous examinerons la définition 2.

Prenons ** 495 ** comme exemple.

Le nombre maximum qui peut être fait en réorganisant 495 est 954 et le nombre minimum est 459. 954 --459 = 495, il est donc maintenant égal au nombre d'origine ** 495 **! c'est intéressant!

Un tel nombre s'appelle le nombre capreca, Le nombre de chiffres que nous voyons habituellement est uniquement dénombrable.

Passons maintenant au programme principal Ruby.

Détermine si un entier est le nombre de capreca

kaprekar.rb


num = 627

#Stocker dans la baie
arr = num.to_s.split('').map!(&:to_i)
p arr   # => [6, 2, 7]

#Trier pour faire le maximum et le minimum
max = arr.sort{ |a, b| a <=> b }.join('').to_i
min = arr.sort{ |a, b| b <=> a }.join('').to_i
p max   # => 762
p min   # => 267

#maximum-Déterminer si le minimum est le même que le nombre d'origine
diff = max - min
p diff == num   # => false

Maintenant, en réécrivant «num», vous pouvez juger ** un seul entier arbitraire **.

Déterminer si le nombre de capreca se situe dans une certaine plage

À partir de là, utilisons le traitement itératif pour savoir s'il existe un nombre Capreca dans ** une plage particulière **.

kaprekar.rb


result = []
num = 1
final = 1_000_000

while num < final do
  arr = num.to_s.split('').map!(&:to_i)
  min = arr.sort{ |a, b| a <=> b }.join('').to_i
  max = arr.sort{ |a, b| b <=> a }.join('').to_i
  diff = max - min

  if diff == num
    result.push("【#{num}】 #{max} - #{min} = #{diff}")
  end

  num += 1
end

if result.empty?
  result.push("N'est pas applicable")
end

puts result

(Pour la lisibilité, je n'ose pas utiliser l'opérateur ternaire)

terminal


【495】 954 - 459 = 495
【6174】 7641 - 1467 = 6174
【549945】 995544 - 445599 = 549945
【631764】 766431 - 134667 = 631764

Dans l'exemple ci-dessus, lorsque j'ai essayé avec jusqu'à 6 nombres entiers, j'ai trouvé 4 nombres capreca. Il est également étrange qu'il n'existe pas à 5 chiffres!

De côté

Cela dépend des spécifications du PC, mais il faudra beaucoup de temps pour le traiter 1 million de fois.

Regardez le nombre 495 introduit au début Vous avez un sens mathématique lorsque vous avez immédiatement trouvé 495 = 99 × 5. Oui, tous les nombres capreca sont ** 9 multiples **.

Ainsi, même si vous ne le faites pas 1 million de fois, vous pouvez réduire encore plus le traitement en ne vérifiant que les multiples de 9.

Si vous avez une meilleure façon de l'écrire, faites-le nous savoir dans les commentaires!

** (Ajouté le 29/06/2020) ** J'ai reçu un commentaire immédiatement et posté la version améliorée dans la section des commentaires!

Recommended Posts

J'ai essayé d'utiliser Ruby pour voir s'il y a un nombre capreca dans un entier dans une certaine plage
J'ai vérifié le nombre de taxis avec Ruby
J'ai fait un interpréteur (compilateur?) Avec environ 80 lignes en Ruby.
Comment changer une chaîne dans un tableau en un nombre dans Ruby
J'ai recherché un framework web avec Gem en Ruby
Je veux ForEach un tableau avec une expression Lambda en Java
J'ai essayé un problème de calendrier avec Ruby
J'ai fait une mort risquée avec Ruby
Comment vérifier si une variable d'instance est définie dans une classe Ruby
Comment démarrer un indice à partir d'un nombre arbitraire dans le traitement itératif Ruby