[JAVA] Chaîne de menteur

Avez-vous déjà vu un tel problème mathématique?

"Sur ce papier Le numéro 1 est ■, le numéro 2 est ■, Le nombre 3 est ■ pièces, nombres autres que 1 à 3 Le nombre est écrit en ■. "

Un mystérieux morceau de papier est tombé. Sur ce papier, le papier lui-même est écrit. Cependant, les quatre nombres écrits en ■ ont disparu et je ne peux pas les lire. Veuillez mettre un nombre dans ■ pour que cette phrase soit correcte.

Les réponses sont 4, 1, 3, 1 dans l'ordre. Veuillez appliquer les chiffres et vérifier Il s'agit d'un problème de combinaison au niveau des mathématiques du secondaire.

Des choses étranges se produisent lorsque vous vous mentionnez de cette manière.

Peut-il y avoir un programme qui détermine s'il y a une boucle infinie dans le programme?

Cela peut conduire au problème. Aucun programme de ce type ne peut exister. Mais qu'en est-il du problème suivant?

"Cette phrase contient () le chiffre 1"

Appliquons 1 à (). Puis

"Cette phrase contient (1) le chiffre 1"

Ce sera. Puisque 1 apparaît deux fois au total dans le texte, cela contredit le sens du texte. Le nombre entre () n'est pas 1.

Appliquons un entier autre que 1 qui vaut 9 ou moins.

Ensuite, 1 n'apparaît qu'une seule fois dans le texte, mais () aurait dû être différent de 1, c'est donc une contradiction. En d'autres termes, ce n'est pas un entier autre que 1 qui vaut 9 ou moins.

Alors, est-ce 10 ou plus? En aucune façon. Ce ne serait pas possible.

En d'autres termes, il n'y a pas d'entier entre ().

J'ai pu prouver que c'est mathématiquement impossible. Oui, la fin

La réponse existe-t-elle vraiment? Non n'existe pas. C'est sans fin.

Cliquez ici pour la réponse du modèle

\frac{1}{2}+\frac{3}{2}

La formule ci-dessus contient un seul 1. Par conséquent, un total de 1 apparaît deux fois dans le texte. De plus, si vous calculez la formule ci-dessus, le résultat sera 2.

De cette manière, le résultat du calcul entre les nombres réels doit correspondre au nombre de 1 qui apparaît dans la formule.

Voici l'exemple.

\lceil \sqrt{2} \rceil ,(6-5)
,\cos^2 49^ \circ +\sin^2 49^\circ, etc \cdots

Certainement, c'est comme si. Mais je n'aime pas vraiment ça Je pense que ce n'est qu'une expression, pas un nombre.

"Il y a des pommes 1/2 $ + 3/2 $" dans la vie de tous les jours Je ne dis pas ça. Seul un ordinateur suffit pour traiter la formule comme un nombre.

Puis j'ai proposé la notation binaire des nombres entiers. Par exemple, appliquez 0010b à () dans le texte. Un total de 1 apparaît deux fois dans le texte. De plus, comme 0010b représente 2 en notation décimale, j'ai pu composer des phrases sans aucune contradiction.

En notation binaire, seuls les 0 et les 1 représentent des nombres, cette méthode peut donc énumérer des nombres sémantiquement cohérents.

Et si vous mettez cette chaîne d'entiers dans le dictionnaire d'entiers en ligne, elle pourrait devenir populaire ...

J'ai immédiatement écrit le programme. C'est un programme simple qui prend environ 3 minutes.

En aparté, l'implémentation interne d'Integer.bitCount de Java est intéressante, je vais donc la présenter.

public static int bitCount(int i) { i = i - ((i >>> 1) & 0x55555555); i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); i = (i + (i >>> 4)) & 0x0f0f0f0f; i = i + (i >>> 8); i = i + (i >>> 16); return i & 0x3f; }

Avec cela seul, nous pouvons compter le nombre de 1 bits de int. Il suffit de déplacer et d'opérations logiques sans utiliser la syntaxe de contrôle telle que les boucles et les conditions Je peux l'implémenter ... Le montant du calcul est de $ O (1) $ car aucune boucle n'est utilisée. sensationnel Ceci est basé sur un algorithme de recherche de chaînes appelé Wavelet Tree.

Maintenant, revenons au sujet principal. Exécutez le programme. Avec excitation ./test.out 2000 Quel succès. Alors le résultat de l'exécution est

2 3

cette? seulement ça? Augmenter le nombre ne change pas le résultat. Cela semble fonctionner correctement à l'intérieur.

C'est vrai. Si vous y réfléchissez, le taux d'augmentation du nombre de bits de 1 dans l'entier est au moins Puisqu'il peut être maintenu en dessous de $ \ log_2 n $, il ne peut pas rivaliser avec $ n $, qui augmente linéairement.

Je suis gêné de ne pas avoir réalisé une chose aussi naturelle

La preuve ci-dessous

Pour un entier $ n $ supérieur ou égal à 0 2^{i-1} \le n \le 2^i Il y a un i qui satisfait. A ce moment, $ i $ représente le nombre de bits requis pour représenter $ n $ en notation binaire.

Définissez la fonction $ B (n) $ comme suit

$ B (n) $: = {nombre de 1 bits lorsque $ n $ est exprimé en notation binaire}

C'est, B(n)+1=n Montre juste Le côté gauche représente le total dans lequel 1 apparaît dans le texte

Par définition $ B (n) $ est 0 \le B(n) \le i Rencontrer. à partir de maintenant i-1 \le \log_2 n Donc

0 \le B(n)=n-1 \le i \le 1+\log_2 n 0 \le n \le 2+\log_2 n

L'équation est valable pour $ n = 4 $

À partir de là, $ 0 \ le n \ le 4 $ a été affiché.

Par conséquent, seuls quelques entiers satisfont l'équation.

C'était plutôt naturel.

C'était un problème que je trouvais si intéressant que je ne pouvais pas dormir la nuit, mais en réalité Un résultat naturel sans surprise.

Qu'est-ce que c'est bosselé?

Leçon: La plupart des idées qui viennent avant d'aller au lit comportent des pièges.

c'est tout.

Recommended Posts

Chaîne de menteur
Chaîne
Chaîne Java
Remplacement de la chaîne de caractères
java.lang Résumé 2 (chaîne)
Pratique du tampon de chaîne
[Java] Remplissage de la chaîne de caractères
Comparaison des chaînes MyBatis
Traitement des chaînes Java
Méthodes de classe de chaîne
Chaîne divisée (Java)