Mathematische challenge

Status
Nicht offen für weitere Antworten.
H

hans5

Gast
hallöchen; ich bräuchte mal eure Hilfe:

Ich hab folgende Aufgabe gestellt bekommen:
145 is a curious number, as 1! + 4! + 5! = 1 + 24 + 120 = 145.
Find the sum of all numbers which are equal to the sum of the factorial of their digits.
Note: as 1! = 1 and 2! = 2 are not sums they are not included.
Man soll also alle Zahlen aufaddieren, deren Summe der Fakultäten der einzelnen Ziffern gleich der Zahl selber ist.
Dazu hab ich mal schnell nen programm geschrieben:

Code:
public class problem34 {

	public static double fakultat(double n){
		double p=1;
		for(int i=1;i<=n;i++){
			p*=i;
		}
		if(n==0){
			p=0;
		}
		return p;
	}
	
	
	public static void main(String[] args) {
		
		int sum=0;
		//Speichert die Summe aller gefunden zahlen, die 
		//die gesuchte Eigenschaft finden
		double[] ziffer=new double[7];
		//Speicher alle ziffern, der zu untersuchenden Zahl
		double summe;
		//Speichert die Summe aller Fakultäten der einzelnen ZIffern
		//der zu untersuchenden Zahl
		for(double i=3;i<2540161;i++){
			//i ist die zu untersuchende Zahl
			summe=0;
			//Für jedes neue i wird die summe natürlich auf null gesetzt;
			
			//Diese Schleife speichert die ziffern des Zahl i in dem array ziffer
			for(int z=0;z<7;z++){
				ziffer[z]=((i%Math.pow(10,7-z))-(i%Math.pow(10, 6-z)))/(Math.pow(10, 6-z));
			}
			
			/*
			 * Nicht von Belangen
			 * for(int k=0;k<7;k++){
			 *	System.out.print(ziffer[k]+" " );	
			 *  }
			 * System.out.println();
			 *
			*/
			
			//diese folgende Forschleife berechnet die
			// Summe der Fakultäten der einzelnen Ziffern
			for(int z=0;z<7;z++){
				summe+=fakultat(ziffer[z]);
				//System.out.println(fak(ziffer[z]));
			}
			//System.out.println(summe);
			
			//Falls die Summe gleich der zu prüfenden Zahl ist
			//so wird die sum um die Zahl i erhöht und i wird ausgeben
			if(summe==i){
				System.out.println(i);
				sum+=i;
			}
		
		}
		//Zum schluss wird natürlich die Lösung ausggeeben
		System.out.println(sum);
		
	}

}/*
Wie ich auf die oberste Schranke für i gekommen bin:
Ich hab mir zuerst überlegt, ob eine achtstellige zahl die
 genannte Eigenschaft haben kann:
 D.h. ich hab die größtmögliche Summe der Fakultäten einer 
 achtstellige Zahl untersucht:
 99999999 => 9!+9!..+9!=8*9!=2903040. Da dies jedoch "nur" eine siebensetllige Zahl ist, 
 kann keine achtstellige Zahl die gesuchte Eigenschaft besitzen. 
 also ist die größt mögliche Zahl gegeben durch:
 9999999 => 9!+9!..+9!=7*9!=2510160
 */
Ich weiß, dass das Programm nicht erste Sahne ist und man es effizienter schreiben könnte. Doch mein Problem ist es, dass das Programm nicht alle Zahlen, mit der genannten Eigenschaft findet.
Es findet lediglich die Zahl 145;
Seht ihr den logischen Fehler?
Es muss noch mehr zahlen als die 145 mit der genannten Eigenschaft geben, da 145 als Lösung nicht akzeptiert wird
Bitte helft mir:)
 

0x7F800000

Top Contributor
nja... der code ist in der tat nicht die erste sahne, eher das allerletzte spaghetti ;)
ich weiß jetzt nicht ob es daran liegt, aber wieso hast du dir absichtlich die fakultätsfunktion mit
Code:
    if(n==0){
         p=0;
      }
kaputtgemacht??
Dann liefert dein ganzes programm schonmal falsche ergebnisse für alle zahlen die eine 0 beinhalten. Vielleicht hast du dadurch die anderen seltenen Lösungen übersehen, weil die eine 0 in der dezimaldarstellung beinhalten.

und was haben die ganzen double's im code zu suchen? Willst du die Lösungen auch noch wegen unnötiger rundungsfehler übersehen oder was? mach das bloß weg...
 

Landei

Top Contributor
Jaja, das Projekt Euler...

1) nimm int, wenn du mit Ganzzahlen rechnest
2) berechne die Fakultät nicht so superkompliziert
3) nimm int, wenn du mit Ganzzahlen rechnest
4) die führenden Nullen im ziffer-Array dürfen nicht mitgerechnet werden
5) ach ja, bevor ich's vergesse: Nimm int, wenn du mit Ganzzahlen rechnest

Code:
public class problem34 {

   public static int fakultat(int n){
       return n > 0 ? n * fakultat(n-1) : 1;
   }

   public static void main(String[] args) {

      int sum=0;
      int[] ziffer=new int[7];
      for(int i=3;i<2540161;i++){
         int k = i;
         for(int z=6;z>=0;z--){
            ziffer[z]= k % 10;
            k = k / 10;
         }
         int summe=0;
         boolean leadingZero = true;
         for(int z=0;z<7;z++){
             if (ziffer[z] != 0) {
                 leadingZero = false;
             }
             if (! leadingZero) {
               summe+=fakultat(ziffer[z]);
             }
         }
         if(summe==i){
            System.out.println(i);
            sum+=i;
         }
      }
      System.out.println(sum);
   }

}
 

Landei

Top Contributor
Man kann natürlich alles noch ein wenig zusammenfassen:

Code:
public class problem34 {

   public static int fakultat(int n){
       return n > 0 ? n * fakultat(n-1) : 1;
   }

   public static void main(String[] args) {

      int sum=0;
      for(int i=3;i<2540161;i++){
         int summe=0;
         for(int k = i; k > 0; k /= 10){
            summe += fakultat(k % 10);
         }
         if(summe==i){
            System.out.println(i);
            sum+=i;
         }
      }
      System.out.println(sum);
   }
}
 

0x7F800000

Top Contributor
Code:
public class Factorions {
	private static int[] faculty={1,1,2,6,24,120,720,5040,40320,362880};
	private static boolean isFactorion(int n){
		int sum,temp=n;
		for(sum=0;n>0;sum+=faculty[n%10],n/=10);
		return sum==temp;
	}
	public static void main(String... _){
		for(int i=0; i<10000000; i++){
			if(isFactorion(i)) System.out.println(i);
		}
	}
}
oder so irgendwie... :oops:
 

0x7F800000

Top Contributor
hans5 hat gesagt.:
ja so spart man nochmal ne Ecke Rechenzeit:)
thx
wo es nix bringt, da bringt's nichts. ;)
Aber die vorgehenswise sollte man im Hinterkopf behalten, das kann in viel weniger offensichtlichen Anwendungsfällen sehr wichtig werden.
 
G

Guest

Gast
Ich denke ProjectEuler ist dazu da sich selbst Gedanken zu machen, besonders bei solchen trivialen Problemen.
In irgendwelchen Foren nachfragen ist nicht Sinn der Seite.
 

Landei

Top Contributor
Sehe ich nicht so. Die Lösung am Anfang war zwar nicht hübsch, wäre aber "fast" gelaufen. Also hat sich hans5 offenbar schon ziemlich viel Gedanken gemacht. Und warum soll man dann nicht einen kleinen Stupps in die richtige Richtung geben?
 

hdi

Top Contributor
Ja, das sind halt immer diese "Gäste" die nichts besseres zu tun haben als unproduktiven Mist zu schreiben. So in etwa wie ich es grad mache ???:L
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben