Trouver le plus grand palindrome fait le produit de deux nombres de 3 chiffres
package testing.project;
public class PalindromeThreeDigits {
public static void main(String[] args) {
int value = 0;
for(int i = 100;i <=999;i++)
{
for(int j = i;j <=999;j++)
{
int value1 = i * j;
StringBuilder sb1 = new StringBuilder(""+value1);
String sb2 = ""+value1;
sb1.reverse();
if(sb2.equals(sb1.toString()) && value<value1) {
value = value1;
}
}
}
System.out.println(value);
}
}
C'est le code que j'ai écrit en Java... Est-il un moyen efficace d'autres que cela.. Et peut-on optimiser ce code de plus??
Bien sûr, vous pouvez l'optimiser plus, vous pouvez faire un peu de mathématiques de votre propre sur le papier pour réduire l'espace de recherche. Cela devient alors une question de ce que la personne qui a mis la cession est prêt à accepter en tant OK, car il n'y a qu'une seule bonne réponse à la question, et la façon optimale de l'impression que le nombre est juste pour le mettre dans la source comme une chaîne de caractères. Un concept connexe est la différence entre la façon de déterminer si un nombre est premier, et la production d'un certificat que c'est le premier.
Jessop, Pouvez-vous donner quelques exemple avec le code de ce problème..
Par exemple, un programme qui ne
J'ai comme l'impression. Il montre la véritable optimisation. Mais je ne veux pas l'accepter comme un professeur 🙂
droit, mais en tant que professeur, vous avez à décider d'accepter autre chose qu'une recherche sur tous les produits de nombres de 3 chiffres, ou tous les palindromes dans la gamme, ceux de la "évidente" des moyens de force brute. Si vous n'permettre une optimisation basée sur les maths et les résultats, vous devez décider comment bien une preuve écrite que vous exigez que le programme est correct. Tous les problèmes de programmation de la forme, "écrire un programme qui affiche le numéro unique décrit par la suite..." part de ce problème à un niveau plus ou moins évident mesure.
Jessop, Pouvez-vous donner quelques exemple avec le code de ce problème..
Par exemple, un programme qui ne
System.out.println("906609");
est fonctionnellement équivalente à la vôtre (la preuve ne rentre pas dans cette marge), et pas de doute c'est plus rapide. C'est un exemple extrême de la coupe de l'espace de recherche, bien sûr. Un très faible gain de performance serait dû en commençant à 101 au lieu de 100 que la boucle inférieure lié, puisque tout ce divisibles par 100, se termine dans 00
et n'est donc pas un palindrome. Vous devez décider pour vous-même, où dans le spectre que vous avez fait "trop" preuve mathématique et pas assez intensives.J'ai comme l'impression. Il montre la véritable optimisation. Mais je ne veux pas l'accepter comme un professeur 🙂
droit, mais en tant que professeur, vous avez à décider d'accepter autre chose qu'une recherche sur tous les produits de nombres de 3 chiffres, ou tous les palindromes dans la gamme, ceux de la "évidente" des moyens de force brute. Si vous n'permettre une optimisation basée sur les maths et les résultats, vous devez décider comment bien une preuve écrite que vous exigez que le programme est correct. Tous les problèmes de programmation de la forme, "écrire un programme qui affiche le numéro unique décrit par la suite..." part de ce problème à un niveau plus ou moins évident mesure.
OriginalL'auteur arsenal | 2011-08-25
Vous devez vous connecter pour publier un commentaire.
Nous supposons que le plus grand palindrome aura six chiffres plutôt que cinq, parce que 143*777 = 111111 est un palindrome.
Comme indiqué ailleurs, à 6 chiffres en base 10 palindrome abccba est un multiple de 11. C'est vrai, car une*100001 + b*010010 + c*001100 est égal à 11*un*9091 + 11*b*910 + 11*c*100. Donc, à l'intérieur de notre boucle, nous pouvons diminuer n par étapes de 11 si m n'est pas un multiple de 11.
Nous essayons de trouver le plus grand palindrome de moins d'un million, qui est un produit de deux nombres de 3 chiffres. Pour trouver une grande suite, nous essayons de grands diviseurs premiers:
Nous garder une trace de la plus grande palindrome trouvé jusqu'à présent dans la variable q. Supposons que q = r·s avec r <= s. Habituellement, nous avons m < r <= s. Nous avons besoin de m·n > n >= q/m. En tant que plus grand palindromes sont trouvés, la gamme de n devient de plus en plus restreint, pour deux raisons: q devient plus grand, m devient plus petit.
La boucle interne d'attaché programme s'exécute uniquement 506 fois, vs le ~ 810000 fois le naïf programme utilisé.
Note, le programme est en C, mais même les techniques de travail en Java.
OriginalL'auteur James Waldby - jwpat7
Ce que je voudrais faire:
Code:
Cela semble comme il le serait moins efficace que de simplement faire le paires de multiplications. Calcul de la factorisation en nombres premiers habituellement prend O(sqrt N) opérations, et puis une fois que vous avez eu, en essayant de trouver un moyen de le diviser en deux nombres à trois chiffres me semble qu'il est assez gourmand en ressources. Si j'ai bien admettre que c'est une idée vraiment cool!
Pouvez-vous donner l'exemple avec le code ... Qui sera d'une grande aide pour moi..
il y a seulement 167 nombres premiers inférieurs à 1000 (qui est la limite ici), mais un éligibles nombre herecan avoir au plus 20 facteurs. Si vous le commerce de 900 multiplie par 20 mods... C'est une grande victoire, de l'omi. Aussi, en partant de l'arrière vous donne la possibilité de choisir le reste, sans l'exigence de vérification de tous les autres "juste pour faire sûr".
Hmm, j'ai oublié que le nombre de nombres premiers est bornée. Cependant, pourriez-vous essayer (dans certains horrible pire des cas) de tous les possibles façons de partitionner les facteurs pour obtenir deux nombres qui sont tous les trois chiffres? C'est ma principale préoccupation, mais honnêtement, je ne sais pas si c'est quelque chose à craindre.
OriginalL'auteur corsiKa
Nous pouvons traduire la tâche dans la langue des mathématiques.
Pour un court laps de commencer, nous allons utiliser des caractères que les chiffres:
Maintenant, nous avons deux expressions mathématiques, et peut définir les a,b,c,x,y,z € de {0..9}.
Il est plus précis pour définir une et x de l'élément de {1..9}, pas {0..9}, parce que 097 n'est pas vraiment un nombre à 3 chiffres, est-il?
Ok.
Si l'on veut produire un grand nombre, nous devrions essayer de parvenir à un 9......-Nombre, et depuis il est palindromique, il doit être du modèle 9....9. Si le dernier chiffre est un 9, puis à partir de
ensuit que z*c a mener à un certain nombre, se terminant par le chiffre 9 - tous les autres calculs ne pas infecter le dernier chiffre.
Donc, c et z de (1,3,7,9) parce que (1*9=9, 9*1=9, 3*3=9, 7*7=49).
Maintenant un peu de code (Scala):
Alors je voudrais de les trier par taille, et en commençant par le plus grand, les tester pour être palindromique. Je voudrais donc omettre de tester un petit nombre pour être palindromique, parce que cela pourrait ne pas être si bon marché.
Pour des raisons esthétiques, je ne voudrais pas prendre un (toString.inverse == toString), mais un appel récursif à diviser et modulo solution, mais sur les machines d'aujourd'hui, il ne fait pas beaucoup de différence, n'est ce pas?
Pour des performances sérieuses considérations, je voudrais la tester contre un toString/inverse/égale approche. Peut-être que c'est de pire en pire. Il n'début, mais la division et le modulo ne sont pas connus pour être le plus rapide des opérations, et je les utiliser pour faire une Liste à partir de l'Int. Il serait travailler pour BigInt ou de Long avec quelques redeclarations, et travaille à nice avec Java; pourrait être mise en œuvre en Java, mais un aspect différent.
D'accord, de mettre les choses ensemble:
Là où 835 tous les numéros de téléphone > 900000, et il retourne assez vite, mais je pense que même plus de force brute n'est pas beaucoup plus lent.
Peut-être qu'il est beaucoup plus habile façon de construire la plus haute palindrom, au lieu de chercher pour elle.
Un problème est: je ne l'ai pas su avant, qu'il existe une solution > 900000.
Une approche très différente, et pour produire de grandes palindromes, et de déconstruire leurs facteurs.
OriginalL'auteur user unknown
fixe !!!, merci ....
OriginalL'auteur vikkyhacks
OriginalL'auteur Tobin Joy
Une approche légèrement différente que l'on peut facilement calculer le plus grand nombre palindrome fait le produit de deux à 6 chiffres.
La première partie consiste à créer un générateur de nombre palindrome. Donc, il n'est pas nécessaire de vérifier si un nombre est palindromique, la deuxième partie est une simple boucle.
OriginalL'auteur Anastasios
Vous pouvez utiliser le fait que 11 est un multiple de le palindrome de réduire l'espace de recherche. On peut y arriver, car nous pouvons supposer que le palindrome de 6 chiffres et >= 111111.
par exemple ( à partir de projecteuler 😉 )
Vérifier si je mod 11 != 0, alors la boucle j peut être soustraite par 11 (à partir de 990) depuis au moins un des deux doit être divisible par 11.
Elle devrait être pour tout palindrome qui a deux à 3 chiffres facteurs. 111111 = 143*777
Je dois ajouter, 11 est un multiple de tout palindrome avec un même nombre de chiffres
Un diviseur - pas un multiple.
inconnu - oups, merci.
OriginalL'auteur scott
Vous pouvez essayer la procédure suivante qui imprime
Bon point. J'ai manqué. Faire juste les numéros à deux chiffres est trivial, car vous pouvez le faire par force brute en milli-secondes.
OriginalL'auteur Peter Lawrey
OriginalL'auteur Ratan Kumar
C'est le code en C, un peu long, mais fait le travail.:)
palndr
fonctionOriginalL'auteur Nick
Vous pouvez réellement le faire avec Python, c'est facile il suffit de prendre un coup d'oeil:
OriginalL'auteur Andres
Puisque nous ne sommes pas à vélo sur les deux itérateurs (num1 et num2) en même temps, le premier palindrome numéro nous trouvons sera la plus grande. Nous n'avons pas besoin de tester pour voir si le palindrome nous avons trouvé est le plus grand. Cela réduit considérablement le temps qu'il faut pour calculer.
OriginalL'auteur KNU
J'ai essayé la solution par Tobin, de la joie et de vickyhacks et deux d'entre eux produire le résultat 580085 qui est le problème ici, c'est ma solution, bien que très maladroit:
OriginalL'auteur user2419305
Plus probablement, c'est la réplication de l'un de l'autre solution, mais ça a l'air simple en raison de pythonified code ,même s'il est un peu brute-force.
OriginalL'auteur erogol
Ce sujet : en python
OriginalL'auteur James Sapam
Je crois qu'il y est une approche plus simple: Examiner les palindromes descendant le plus grand produit de deux numéros à trois chiffres, la sélection de la première palindrome avec deux à trois chiffres de facteurs.
Voici le code Ruby:
premier.rb:
palindrome_range.rb:
OriginalL'auteur Brendan
OriginalL'auteur Tanzeel