Java :: Aufgabe #214

3 Lösungen Lösungen öffentlich

Teufelskreis einer selbstbezüglichen Aussage

Anfänger - Java von hollst - 17.12.2018 um 18:46 Uhr
Die folgende Aussage sei gegeben als String:

"Dieser Satz hat vierzig Buchstaben sowie einen Punkt."


Die Aussage ist natürlich falsch, denn der Satz hat tatsächlich fünfundvierzig Buchstaben.

Ersetzen wir nun in der Aussage das Wort "vierzig" durch "fünfundvierzig" bleibt die Aussage aber trotzdem falsch,

denn der neue Satz hat zweiundfünfzig Buchstaben. Schöner Teufelskreis, oder?


Schreibe ein Programm mit dem überprüft wird, ob es überhaupt eine (ausgeschriebene) Zahl gibt, die oben zu einer wahren Aussage führt.

Viel Spaß!

Lösungen:

vote_ok
von just_a_noob (60 Punkte) - 02.02.2019 um 14:10 Uhr
Wahrscheinlich sehr umständlich gelöst aber es geht :)

Quellcode ausblenden Java-Code
import java.util.Scanner;

public class ZahlTextAussage {

    private static String zahlZuText(int zahl)
    {
        String textzahl = "leer";
        String einsbiszwölf[] = {"ein","zwei","drei","vier","fünf","sechs","sieben","acht","neun","zehn","elf","zwölf","sechzehn","siebzehn"};
        String zehner[] = {"zehn","zwanzig","dreißig","vierzig","fünfzig","sechzig","siebzig","achtzig","neunzig"};
        String und = "und";
        if(zahl <= 12)
        {
            textzahl = String.valueOf(einsbiszwölf[zahl-1]);
        }
        if (zahl >=13 && zahl <=15){
            int zehnerindex = zahl / 10;
            int einerIndex = zahl % 10;
            textzahl = String.valueOf( einsbiszwölf[einerIndex-1]+zehner[zehnerindex-1] );
        }
        if(zahl == 16)
        {
            textzahl = String.valueOf(einsbiszwölf[12]);
        }
        if(zahl == 17)
        {
            textzahl = String.valueOf(einsbiszwölf[13]);
        }
        if (zahl == 20 || zahl == 30 || zahl == 40 || zahl == 50 || zahl == 60 || zahl == 70 || zahl == 80 || zahl == 90){
            int zehnerindex = zahl / 10;
            textzahl = String.valueOf(zehner[zehnerindex-1]);
        }
        if(zahl >=18 && zahl <= 19  || zahl >=21 && zahl <= 29 || zahl >= 31 && zahl <= 39 || zahl >= 41 && zahl <= 49 || zahl >= 51 && zahl <= 59 || zahl >= 61 && zahl <= 69 || zahl >= 71 && zahl <= 79 || zahl >= 81 && zahl <= 89 || zahl >= 91 && zahl <= 99)
        {
            int zehnerindex = zahl / 10;
            int einerIndex = zahl % 10;
            textzahl = String.valueOf( einsbiszwölf[einerIndex-1]+und+zehner[zehnerindex-1] );
        }
        return textzahl;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String satz1 = "Dieser Satz hat ";
        String satz2 = " Buchstaben sowie einen Punkt.";
        for (int zahl = 1; zahl <= 99; zahl++) {
            String zsm = satz1 + zahlZuText(zahl) + satz2;
            if (zahl == zsm.length()) {
                System.out.printf("%s\n", zsm);
                System.out.printf("Die Länge des Satzes beträgt %d", zsm.length());
                break;
            }
        }
    }
}
vote_ok
von nOrdan (1160 Punkte) - 20.06.2019 um 01:04 Uhr
Main-Klasse:

Quellcode ausblenden Java-Code


import Methodensammlung.UebersetzerZahlenDeutsch;

import Methodensammlung.Methoden;

/**
 * Aufgabe:
 * 
 * Die folgende Aussage sei gegeben als String: "Dieser Satz hat vierzig Buchstaben sowie einen Punkt."
 * Die Aussage ist natürlich falsch, denn der Satz hat tatsächlich fünfundvierzig Buchstaben.
 * Ersetzen wir nun in der Aussage das Wort "vierzig" durch "fünfundvierzig" bleibt die Aussage aber trotzdem falsch, denn der neue Satz hat zweiundfünfzig Buchstaben. Schöner Teufelskreis, oder?
 * Schreibe ein Programm mit dem überprüft wird, ob es überhaupt eine (ausgeschriebene) Zahl gibt, die oben zu einer wahren Aussage führt.
 * 
 * @author (nOrdan) 
 * @version (20.06.19)
 */

public class Teufelskreis
{    
    
    UebersetzerZahlenDeutsch u = new UebersetzerZahlenDeutsch();
    
    Methoden m = new Methoden();
    
    public static void main(String [] args)
    {
        Teufelskreis t = new Teufelskreis();
        t.kreis();
    }
    
    private void kreis()
    {
        boolean valid1 = false;
        String satz = "Dieser Satz hat vierzig Buchstaben sowie einen Punkt"; 
        String clear = satz.replaceAll("\\s+","");
        while (valid1 == false)
        {
            String laenge = Integer.toString(clear.length()); 
            satz = "Dieser Satz hat " + u.zehner(laenge.charAt(1),laenge.charAt(0)) + " Buchstaben sowie einen Punkt";
            clear = "DieserSatzhat" +  u.zehner(laenge.charAt(1),laenge.charAt(0)) + "BuchstabensowieeinenPunkt";
            if (clear.length() == m.parseInt(laenge))
            {
                valid1 = true;
            }   
            else
            {
                continue;
            }
        }
        m.informationMessage("Der Satz in welchem die Aussage stimmt ist: " + satz,"Ergebnis");
    }
}



Methoden die ich aus meinem Methodensammlung package benutzt habe:

Quellcode ausblenden Java-Code

 private String einer(char einer,int speziell)
    {
        String x = ""; //Lokale Variable zum Speichern des Ergebnisses
        switch (einer) //Einfache switch-case Anweisung mit der Einerstelle (einer) als Ausdruck zum auswerten
        {
            case '1': 
            if (speziell == 1)
            {
                x = ein + "s"; //x wird wenn der Case eintritt gleich dem deutschen Wort für die Zahl die überprüft wurde gesetzt
            }
            else
            {
                x = ein;
            }
            break;
            case '2':
            x = zwei;
            break;
            case '3':
            x = drei;
            break;
            case '4':
            x = vier;
            break;
            case '5':
            x = fuenf;
            break;
            case '6':
            x = sechs;
            break;
            case '7':
            x = sieben;
            break;
            case '8':
            x = acht;
            break;
            case '9':
            x = neun;
            break;
        }
        return x; //Rückgabe des Ergebnisses der Methode 
    }

private String zehner(char einer, char zehner)
    {
        String ausgabe = ""; //Lokale Variable zum Speichern des Ergebnisses
        ausgabe += einer(einer,0);  //Bestimmen der Einerstelle mithilfe der Methode für einstellige Zahle. Das Ergebnis wird der Ausgabe hinzugefügt in welchem die Zehnerzahl schon steht. 
        if (zehner == '1' && einer == '0') //If und else if für die Behandlung von speziellen Fällen für Zahlen, welche wegen der Rechtschreibung nicht zusammengebaut werden können
        {
            return zehn;
        }
        else if (zehner == '1' && einer == '1')
        {
            return elf;
        }
        else if (zehner == '1' && einer == '2')
        {
            return zwoelf;
        }
        else if (zehner == '2' && einer == '0')
        {
            return zwanzig;
        }
        else if (zehner == '3' && einer == '0')
        {
            return drei + bAnhang;
        }
        else if (zehner == '4' && einer == '0')
        {
            return vier + aAnhang;
        }
        else if (zehner == '5' && einer == '0')
        {
            return fuenf + aAnhang;
        }
        else if (zehner == '6' && einer == '0')
        {
            return sechs + aAnhang;
        }
        else if (zehner == '7' && einer == '0')
        {
            return sieben + aAnhang;
        }
        else if (zehner == '8' && einer == '0')
        {
            return acht + aAnhang;
        }
        else if (zehner == '9' && einer == '0')
        {
            return neun + aAnhang;
        }
        else        
        {
            ausgabe += "und";
            switch(zehner) //Switch Anweisung mit Zehnerstelle (zehner) als Ausdruck
            {
                case '2':
                ausgabe += zwanzig; //Der Ausgabe wird beim Eintreffen des Case das deutsche Wort für die Zehnerzahl hinzugefügt
                break;
                case '3':
                ausgabe += drei + bAnhang;
                break;
                case '4':
                ausgabe += vier + aAnhang;
                break;
                case '5':
                ausgabe += fuenf + aAnhang;
                break;
                case '6':
                ausgabe += sechs + aAnhang;
                break;
                case '7':
                ausgabe += sieben + aAnhang;
                break;
                case '8':
                ausgabe += acht + aAnhang;
                break;
                case '9':
                ausgabe += neun + aAnhang;
                break;
            }             
        }
        return ausgabe; //Rückgabe des Ergebnisses
    }
}

vote_ok
von luckyluke (850 Punkte) - 12.02.2020 um 09:59 Uhr
Quellcode ausblenden Java-Code
//Hauptprogramm
package com.company;

public class Main {

    public static boolean checkLenght() {
        NumberToText ntt = new NumberToText();
        int lenght;
        int i = 2;

        while (true) {
            String satz1 = "Dieser Satz hat " + ntt.intToText(i) + " Buchstaben sowie einen Punkt.";

            String satz2 = satz1.replace(" ", "");
            lenght = satz2.length() - 1;
            System.out.println(satz1 + "\n Hat " + lenght + " Buchstaben");
            if (lenght == i) {
                System.out.println(satz1 + "--> Hat genau " + lenght + " Buchstaben");
                return true;

            } else if (i == 1000) {
                return true;
            }
            i++;
        }

    }

    public static void main(String[] args) {
        checkLenght();


    }
}

Zitat:

Neue Klasse

package com.company; import java.io.BufferedReader; import java.io.InputStreamReader; public class NumberToText { public static String intToText10(int x) { int y = x / 10; /* nur Zehnerstelle */ switch (y) { case 1: return "zehn"; case 2: return "zwanzig"; case 3: return "dreißig"; case 4: return "vierzig"; case 5: return "fünfzig"; case 6: return "sechzig"; case 7: return "siebzig"; case 8: return "achtzig"; case 9: return "neunzig"; default: return "FEHLER"; } } public static String intToText100(int x, int digits) { int y = x % 100; /* nur Einer- und Zehnerstelle */ /* -- Sonderbehandlung der Zahl 1 -- */ if (y == 1) { switch (digits) { case 0: return "eins"; case 1: case 2: case 3: return "ein"; case 6: case 9: case 12: case 15: /* -- Einzahl oder Mehrzahl ? -- */ if (x == 1) { return "eine"; } else { return "ein"; } default: return "FEHLER"; } } /* -- Zahlen 2 bis 19 -- */ if ((y >= 2) && (y <= 19)) { switch (y) { case 2: return "zwei"; case 3: return "drei"; case 4: return "vier"; case 5: return "fünf"; case 6: return "sechs"; case 7: return "sieben"; case 8: return "acht"; case 9: return "neun"; case 10: return "zehn"; case 11: return "elf"; case 12: return "zwölf"; case 13: return "dreizehn"; case 14: return "vierzehn"; case 15: return "fünfzehn"; case 16: return "sechzehn"; case 17: return "siebzehn"; case 18: return "achtzehn"; case 19: return "neunzehn"; default: return "FEHLER"; } } /* -- Zahlen 20 bis 99 -- */ if ((y >= 20) && (y <= 99)) { if (y % 10 == 0) { return intToText10(y); } else { return intToText100(y % 10, 1) + "und" + intToText10(y); } } return ""; } public static String intToText1000(int x, int digits) { if (x / 100 == 0) { return intToText100(x, digits); } else { return intToText100(x / 100, 2) + "hundert" + intToText100(x, digits); } } public static String intToTextDigits(int digits, boolean mz) { if (mz) { /* Mehrzahl oder Einzahl ? */ switch (digits) { case 0: return ""; case 3: return "tausend"; case 6: return " Millionen "; case 9: return " Milliarden "; case 12: return " Billionen "; case 15: return " Billiarden "; default: return ""; } } else { switch (digits) { case 0: return ""; case 3: return "tausend"; case 6: return " Million "; case 9: return " Milliarde "; case 12: return " Billion "; case 15: return " Billiarde "; default: return ""; } } } public static String intToText(int x) { int digits; /* Anzahl der bearb. Stellen */ String result; /* Zahl in Worten */ /* -- Sonderfall 0 -- */ if (x == 0) { return "null"; } /* -- alle anderen ganzen Zahlen -- */ digits = 0; result = ""; while (x > 0) { result = (x % 1000 > 0 ? (intToText1000(x % 1000, digits) + intToTextDigits(digits, x % 1000 > 1)) : "") + result; x /= 1000; digits += 3; } return result; } }
1800404

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.