Autor Wątek: Liczebniki w formie słownej  (Przeczytany 2437 razy)

Offline Zarejestruj

  • Użytkownik

# Październik 14, 2015, 16:00:26
Witam

Mam takie zadanie:

"Napisz program, który liczby całkowite przekazane do programu poprzez argumenty wywołania wypisze je w postaci słownej w języku polskim, z odpowiednią odmianą liczebników, na standardowe wyjście System.out. Wykorzystaj w tym programie stablicowane liczebniki składowe (jedności, nastki, dziesiątki i setki). Program ma konwertować na postać słowną dowolne liczby naturalne typu int. Twój program powinien sobie skutecznie poradzić z liczbą 0 oraz 2147483649."

Zacząłem je robić i szło mi dość dobrze:

import java.util.Scanner;

public class Numerals
{
static Scanner userInput = new Scanner(System.in);
public static void main(String[] args)
{

System.out.print("Enter your number: ");
int number = userInput.nextInt();
if (number == 0)
System.out.print("Zero");
else if (number == 1)
System.out.print("Jeden");
else if (number == 2)
System.out.print("Dwa");
else if (number == 3)
System.out.print("Trzy");
else if (number == 4)
System.out.print("Cztery");
}
}

Niestety doczytałem, że program ma poprawnie wypisywać liczby aż do 2147483649. Zatem zanim skończyłbym tworzyć ostatniego "else if'a" wyrosłaby  mi broda a wiek emerytalny wynosiłby już 80 lat. Czy ktoś wie jak można szybciej zrobić to zadanie? Jestem nowy w Javie, robiłem coś w innych językach ale nawet w nich nie wiem jak można by skonwertować liczbę tak żeby wypisywało ją słownie po polsku.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Karol

  • Użytkownik

# Październik 14, 2015, 16:25:38
Zerknij na to http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html
To trochę Ci pomoże :)

Hmm, a może i nie :D
Rozbij liczbę na części: jedności, dziesiętne, setne, tysięczne, etc i potem każdą z nich formatuj osobno.
« Ostatnia zmiana: Październik 14, 2015, 16:29:08 wysłana przez Karol »

Offline lethern

  • Użytkownik

  • +1
# Październik 14, 2015, 17:42:48
Dla żartu wkleję
r=readline()
k=r%10;j=(r%100-k)/10;i=~~(r/100);
t='one0two0three0four0five0six0seven0eight0nine0ten0eleven0twelve0thir0four0fif0six0seven0eigh0nine0twen0thir0for0fif0six0seven0eigh0nine'.split('0');
print((r==0?'zero':(!i?'':(t[i-1]+' hundred '))+(j==1?(t[k+9]+(k<3?'':'teen')):(!j?'':t[j+17]+'ty ')+(!k?'':t[k-1]))).trim());
Ten kod w javascripcie zamieniał liczbę od 0 do 999 na zapis tekstowy słowny po angielsku :D
jak widzisz, 1000 liczb da się ogarnąć w 4 linijkach :D
Oczywiście zaciemnienie kodu nie było złośliwe, zachęcam do własnego wymyślenia rozwiązania :P
« Ostatnia zmiana: Październik 14, 2015, 17:44:51 wysłana przez lethern »

Offline Xion

  • Moderator
    • xion.log

  • +2
# Październik 14, 2015, 19:10:45
Cytuj
Zacząłem je robić i szło mi dość dobrze:


Serio, nie sądziłem że ktoś może na poważnie spróbować takiego rozwiązania :) Zdajesz sobie sprawę, że nawet jeśli skończyłbyś tę drabinkę (crowdsourcing? ;)), to wynikowy kod miałby kilkadziesiąt gigabajtów i najpewniej nie przeszedłby przez kompilator? :)

Dam jedną wskazówkę: zacznij od podziału liczby na jedności, tysiące, miliony i miliardy. Każdy z tych segmentów obsłużysz tak samo; potem wystarczy je tylko połączyć, ewentualnie dodając słowa "tysięcy"/"tysiące" pomiędzy.

Offline koirat

  • Użytkownik

# Październik 14, 2015, 21:29:46
Kiedyś napisałem taką aplikacje w asemblerze, dla mamy do pracy :)
Okienkowa pod windows - było zabawnie.

Offline maro

  • Użytkownik

  • +1
# Październik 14, 2015, 22:18:03
Cytuj
wynikowy kod miałby kilkadziesiąt gigabajtów i najpewniej nie przeszedłby przez kompilator? :)

Przez chwilę zainspirowało mnie to do napisania kodu, który wygeneruje taką drabinkę - ale później stwierdziłem, że szkoda mi czasu ;)

Offline CheshireCat

  • Użytkownik

# Październik 14, 2015, 23:02:32
Da się zrobić efektywniej, ale najprościej będzie zakodować przypadki:
0
1,2,3,...18,19
20,30,...,80,90
100,200,...,900
tysiąc, tysiące, tysięcy
milion, miliony, milionów
miliard, miliardy

A następnie składać liczbę bazując na powyższych słowach.
« Ostatnia zmiana: Październik 14, 2015, 23:05:24 wysłana przez CheshireCat »

Offline Kos

  • Użytkownik
    • kos.gd

# Październik 15, 2015, 00:53:46
Przez chwilę zainspirowało mnie to do napisania kodu, który wygeneruje taką drabinkę - ale później stwierdziłem, że szkoda mi czasu ;)
Lepiej: Napisz szablon który wygeneruje taki kod :-)

Offline świrus

  • Użytkownik
    • Tu trolluje

# Październik 15, 2015, 05:40:24
to wynikowy kod miałby kilkadziesiąt gigabajtów i najpewniej nie przeszedłby przez kompilator? :)
Pewnie  300+GB

Miałem pewien pomysł:
http://codepen.io/anon/pen/MaEOaK
...ale musiałbym zrobić kod scrollowania specjalnie pod to, gdyż wszystkie gotowe virtual scrolle nie dają rady.
Bo wszystkie przeglądarki wymiękają w przypadku overflow lub translate.. :)