Σάββατο 9 Αυγούστου 2008

Τι σκέφτετε ο άνθρωπος όταν δεν έχει κάτι να κάνει!

Σήμερα είχα την φαϊνή ιδέα και έφτιαξα έναν αλγόριθμο που εντοπίζει αριθμούς οι οποίοι έχω ένα ιδιαίτερο χαρακτηριστικό. Τα ψηφία που τους αποτελούν είναι ακριβός τα ίδια σε πλήθος και τιμές με αυτά όλων των πολλαπλασίων τους από 1 εως και 5! Μετά από κάμποση ώρα δοκιμών έχω βρει μόλις τρεις τέτοιους αριθμούς, το 142857, το 1428570 και το 1429857. Πιστεύω ότι θα υπάρχουν άπειροι άλλοι, αλλά μου αρκεί που έφτιαξα κι έναν τέτοιο ωραίο κι απλό αλγόριθμο για να επιβεβαιώσω κάτι που διάβασα για το 142857, αλλά και για να βρω κι άλλους αριθμούς με παρόμοια χαρακτηριστικά.
Επειδή ο κώδικας είναι σχετικά απλός σας τον παραθέτω για κάθε χρήση!
[Το ξέρω οτι έχω εκνευριστικά πολλά σχόλια, απλά για να το κατάλαβει κι όποιος δε ξέρει από Java.. ή και γενικότερα από προγραμματισμό!]

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SearchNumbers {
public static void main(String[] args) {
int i = 0;
//δίνω αρχική τιμή 0 για τον μαγικό αριθμο, αλλά λογο του ότι αυξάνει πριν να ελεγχθεί, θα ξεκινήσει τον έλεγχο απο το αμέσος επόμενο
boolean foundMagicNumber = false;
//Αρχικά ο μαγικός αριθμός δεν έχει βρεθεί
while (!foundMagicNumber) {
//Επαναλαμβάνει μέχρι να βρεθεί ο μαγικός αριθμός
i++;//αυξανω τον μετρητή ώστε κάθε φορά να ελέγχω τον επόμενο ακαίρεο
System.out.println("Check:"+i);
//Τυπώνω το ποιος αριθμός ελέγχεται αυτή τη στιγμή ώστε να ξέρει ο χρήστης που έχει φτάσει ο έλεγχος
MagicNumber n = new MagicNumber(i);
for (int k = 1; k < 6; k++){
//Ψάχνω όλα τα ακαίρεα πολλαπλάσια απο 1 εως και 5
if (!n.isValidMultiplication(k)){
foundMagicNumber=false;
//αν έστω κι ένα πολλάπλάσιο δεν ειναι κατάλληλο δε θα ελεγχθεί κανένα άλλο
break;
//δηλαδή η διαδικασία ελέγχου του συγκεκριμένου αριθμού θα σταματήσει
}else
foundMagicNumber = true;
//ενώ αν ειναι κατάλληλος θα ψάξει να βρει εάν κι ολοι οι αλλοι ειναι, οποτε θα σημαίνει οτι βρέθηκε ο "μαγικός αριθμός"
}
}
System.out.println("Magic number:" + i);
//Οπότε τυπώνει τον μαγικό αριθμο!
}

private static class MagicNumber {
private String digits = null;
private Integer number = -1;

public MagicNumber(Integer number) {
this.number = number;
this.digits = getDigits(number);
//Κρατάμε τα ψηφία του αριθμού για να τα συγκρίνουμε με αυτά των πολλαπλάσιων
}

private boolean isValidMultiplication(int factor) {
Integer result = number * factor;
//Υπολογίζουμε την τιμή του πολλαπλάσιου
return this.digits.equals(getDigits(result));
//Ελέγχουμε αν τα ψηφία του πολλαπλάσιου είναι τα ίδια με αυτα του αριθμού
}

private static String getDigits(Integer number) {
String numberAsString = Integer.toString(number);
//Πρέπει να αντιμετοπίσουμε τον αριθμός ως αλφαριθμιτικό-κείμενο
List digits = new ArrayList();
//Του οποίου τους χαρακτήρες-ψηφία θα μαζέψουμε σε μια λίστα
for (int i = 0; i < numberAsString.length(); i++)
digits.add(numberAsString.charAt(i));
//Αντλούμε ένα ένα τα ψηφία του αριθμού
Collections.sort(digits);
//Τους τακτοποιούμε για να ειναι πάντα με την ιδια σειρά
StringBuffer hashString = new StringBuffer();
//Τα ψηφία με την σωστή σειρά θα τα τοποθετήσουμε σε ένα αλλο αλφαριθμιτικό-κείμενο
for (Character digit : digits)
hashString.append(digit.charValue());
return hashString.toString();
}

}
}

Δεν υπάρχουν σχόλια:

LinkWithin

Blog Widget by LinkWithin

Mobile edition