import java.math.*;
/** A class to obtain the Hebrew language name of an arbitrary precision integer.
*
This class should support all conceivable BigIntegers, limited only by the length of the name itself.
*
Note that for numbers >= 10^9 this program uses the short scale and uses the word *billion* for 10^9 instead of *milliard*
*/
public class HebrewNumberNames{
//Vocabulary
private static final String[] feminineVocabulary={"","\u05d0\u05d7\u05ea","\u05e9\u05ea\u05d9\u05dd","\u05e9\u05dc\u05d5\u05e9","\u05d0\u05e8\u05d1\u05e2","\u05d7\u05de\u05e9","\u05e9\u05e9","\u05e9\u05d1\u05e2","\u05e9\u05de\u05d5\u05e0\u05d4","\u05ea\u05e9\u05e2","\u05e2\u05e9\u05e8","\u05d0\u05d7\u05ea \u05e2\u05e9\u05e8\u05d4","\u05e9\u05ea\u05d9\u05dd \u05e2\u05e9\u05e8\u05d4","\u05e9\u05dc\u05d5\u05e9 \u05e2\u05e9\u05e8\u05d4","\u05d0\u05e8\u05d1\u05e2 \u05e2\u05e9\u05e8\u05d4","\u05d7\u05de\u05e9 \u05e2\u05e9\u05e8\u05d4","\u05e9\u05e9 \u05e2\u05e9\u05e8\u05d4","\u05e9\u05d1\u05e2 \u05e2\u05e9\u05e8\u05d4","\u05e9\u05de\u05d5\u05e0\u05d4 \u05e2\u05e9\u05e8\u05d4","\u05ea\u05e9\u05e2 \u05e2\u05e9\u05e8\u05d4"};
private static final String[] masculineVocabulary={"","\u05d0\u05d7\u05d3","\u05e9\u05e0\u05d9\u05dd","\u05e9\u05dc\u05d5\u05e9\u05d4","\u05d0\u05e8\u05d1\u05e2\u05d4","\u05d7\u05de\u05e9\u05d4","\u05e9\u05e9\u05d4","\u05e9\u05d1\u05e2\u05d4","\u05e9\u05de\u05d5\u05e0\u05d4","\u05ea\u05e9\u05e2\u05d4","\u05e2\u05e9\u05e8\u05d4","\u05d0\u05d7\u05d3 \u05e2\u05e9\u05e8","\u05e9\u05e0\u05d9\u05dd \u05e2\u05e9\u05e8","\u05e9\u05dc\u05d5\u05e9\u05d4 \u05e2\u05e9\u05e8","\u05d0\u05e8\u05d1\u05e2\u05d4 \u05e2\u05e9\u05e8","\u05d7\u05de\u05e9\u05d4 \u05e2\u05e9\u05e8","\u05e9\u05e9\u05d4 \u05e2\u05e9\u05e8","\u05e9\u05d1\u05e2\u05d4 \u05e2\u05e9\u05e8","\u05e9\u05de\u05d5\u05e0\u05d4 \u05e2\u05e9\u05e8","\u05ea\u05e9\u05e2\u05d4 \u05e2\u05e9\u05e8"};
private static final String[] intermediateVocabulary={"\u05e2\u05e9\u05e8\u05d9\u05dd","\u05e9\u05dc\u05d5\u05e9\u05d9\u05dd","\u05d0\u05e8\u05d1\u05e2\u05d9\u05dd","\u05d7\u05de\u05d9\u05e9\u05d9\u05dd","\u05e9\u05e9\u05d9\u05dd","\u05e9\u05d1\u05e2\u05d9\u05dd","\u05e9\u05de\u05d5\u05e0\u05d9\u05dd","\u05ea\u05e9\u05e2\u05d9\u05dd","\u05de\u05d0\u05d4","\u05de\u05d0\u05ea\u05d9\u05dd","\u05e9\u05dc\u05d5\u05e9 \u05de\u05d0\u05d5\u05ea","\u05d0\u05e8\u05d1\u05e2 \u05de\u05d0\u05d5\u05ea","\u05d7\u05de\u05e9 \u05de\u05d0\u05d5\u05ea","\u05e9\u05e9 \u05de\u05d0\u05d5\u05ea","\u05e9\u05d1\u05e2 \u05de\u05d0\u05d5\u05ea","\u05e9\u05de\u05d5\u05e0\u05d4 \u05de\u05d0\u05d5\u05ea","\u05ea\u05e9\u05e2 \u05de\u05d0\u05d5\u05ea"};
private static final String[] largeVocabulary={"","\u05d0\u05dc\u05e3","\u05de\u05d9\u05dc\u05d9\u05d5\u05df","\u05d1\u05d9\u05dc\u05d9\u05d5\u05df","\u05d8\u05e8\u05d9\u05dc\u05d9\u05d5\u05df","\u05e7\u05d5\u05d3\u05e8\u05d9\u05dc\u05d9\u05d5\u05df","\u05e7\u05d5\u05d9\u05e0\u05d8\u05d9\u05dc\u05d9\u05d5\u05df","\u05e1\u05e7\u05e1\u05d8\u05d9\u05dc\u05d9\u05d5\u05df","\u05e1\u05e4\u05d8\u05d9\u05dc\u05d9\u05d5\u05df","\u05d0\u05d5\u05e7\u05d8\u05d9\u05dc\u05d9\u05d5\u05df","\u05e0\u05d5\u05e0\u05d9\u05dc\u05d9\u05d5\u05df"};
private static final String[] largeVocabulary0={"","\u05d0\u05e0","\u05d3\u05d5\u05d0\u05d5","\u05d8\u05e8\u05d9","\u05e7\u05d5\u05d8\u05d5\u05d0\u05d5\u05e8","\u05e7\u05d5\u05d9\u05e0","\u05e1\u05e7\u05e1","\u05e1\u05e4\u05d8\u05e0","\u05d0\u05d5\u05e7\u05d8\u05d5","\u05e0\u05d5\u05d1\u05de"};
private static final String[] largeVocabulary1={"","\u05d3\u05e1","\u05d5\u05d9\u05d2\u05d9\u05e0","\u05d8\u05e8\u05d9\u05d2\u05d9\u05e0","\u05e7\u05d5\u05d3\u05e8\u05d2\u05d9\u05e0","\u05e7\u05d5\u05d9\u05e0\u05e7\u05d5\u05d2\u05d9\u05e0","\u05e1\u05e7\u05e1\u05d2\u05d9\u05e0","\u05e1\u05e4\u05d8\u05d5\u05d0\u05d2\u05d9\u05e0","\u05d0\u05d5\u05e7\u05d8\u05d5\u05d2\u05d9\u05e0","\u05e0\u05d5\u05e0\u05d2\u05d9\u05e0"};
private static final String[] largeVocabulary2={"","\u05e1\u05e0","\u05d3\u05d5\u05d0\u05d5\u05e1\u05e0","\u05d8\u05e8\u05d9\u05e1\u05e0","\u05e7\u05d5\u05d3\u05e8\u05d9\u05e0\u05d2\u05e0","\u05e7\u05d5\u05d9\u05e0\u05d2\u05e0","\u05e1\u05e1\u05e0","\u05e1\u05e4\u05d8\u05d9\u05e0\u05d2\u05e0","\u05d0\u05d5\u05e7\u05d8\u05d9\u05e0\u05d2\u05e0","\u05e0\u05d5\u05e0\u05d2\u05e0"};
//Returns the letter Vav (u05d5) if v is true, otherwise returns the empty String
private static String condVav(boolean v){
return v?"\u05d5":"";
}
//name of a number from 1 to 999
private static String shortname(int n,String[] smallVocabulary,boolean fin,boolean vav){
n=n%1000;
if(!fin){
if(n==1){return "";}
else if(n==2){return condVav(vav)+smallVocabulary[2].substring(0,smallVocabulary[2].length()-1);}
else{return shortname(n,smallVocabulary,!fin,vav);}
}
if(n==0){return "";}
if(n<20){return condVav(vav)+smallVocabulary[n];}
if(n<100){
if(n%10==0){return condVav(vav)+intermediateVocabulary[((n/10)%10)-2];}
return intermediateVocabulary[((n/10)%10)-2]+" \u05d5"+smallVocabulary[n%10];
}
if(n%100==0){return condVav(vav)+intermediateVocabulary[(n/100)+7];}
return intermediateVocabulary[(n/100)+7]+" "+shortname(n%100,smallVocabulary,true,true);
}
//proper short scale word for 1000^n
private static String thousandsPower(long n){
if(n<0){throw new ArithmeticException("negative powers unsupported");}
if(n<=10){return largeVocabulary[(int)n];}n--;
String pow="";
String millias="";
int suffix=(int)((n/10)%10);
while(n>0){
int x=(int)(n%1000);
n/=1000;
pow=(x==0?"":millias)+pow;
pow=largeVocabulary1[(x/10)%10]+pow;
if(!(n==0&&x==1)){pow=largeVocabulary0[x%10]+pow;}
pow=largeVocabulary2[x/100]+pow;
millias+="\u05de\u05d9\u05dc\u05d9\u05d0\u05d4";
}
return pow+(suffix==1?"\u05d9\u05dc\u05d9\u05d5\u05df":"\u05d8\u05d9\u05dc\u05d9\u05d5\u05df");
}
/** Returns the Hebrew short scale masculine name for the given BigInteger n.*/
public static String masculineName(BigInteger n){
return masculineName(n,0);
}
/** Returns the Hebrew short scale masculine name for the BigInteger n*1000^off.
*
This method allows the naming of large numbers without storing the trailing zeroes.
*/
public static String masculineName(BigInteger n,long off){
return name(n,off,false);
}
/** Returns the Hebrew short scale name for the given BigInteger n.*/
public static String name(BigInteger n){
return name(n,0);
}
/** Returns the Hebrew short scale name for the BigInteger n*1000^off.
*
This method allows the naming of large numbers without storing the trailing zeroes.
*/
public static String name(BigInteger n,long off){
return name(n,off,true);
}
//Hebrew Number Name with gender and offset taken into account
private static String name(BigInteger n,long off,boolean feminine){
if(off<0){throw new ArithmeticException("negative offset");}
if(n.signum()==0){return "\u05d0\u05e4\u05e1";}
if(n.signum()==-1){return name(n.negate(),off,feminine)+" \u05e9\u05dc\u05d9\u05dc\u05d9"+(feminine?"\u05ea":"");}
int part=0; String s="";
while(n.signum()>0){
part=n.remainder(BigInteger.valueOf(1000)).intValue();
n=n.divide(BigInteger.valueOf(1000));
if(off==1&&part>=2&&part<=10){
if(part==2){s="\u05d0\u05dc\u05e4\u05d9\u05dd"+s;}
else if(part==8){s="\u05e9\u05de\u05d5\u05e0\u05ea \u05d0\u05dc\u05e4\u05d9\u05dd"+s;}
else{s=feminineVocabulary[part]+"\u05ea \u05d0\u05dc\u05e4\u05d9\u05dd"+s;}
}
else if(off>0&&part>0){s=(part>1?" ":"")+thousandsPower(off)+s;}
if(!(off==1&&part>=2&&part<=10)){s=shortname(part,feminine&&off==0?feminineVocabulary:masculineVocabulary,off==0,n.signum()!=0)+s;}
if(n.signum()>0&&part>0){s=" "+s;}
off++;
}
return s;
}
public static void main(String[] args){
for(int c=0;c<=10000;c++){
String nom=name(BigInteger.valueOf(c)).replace(" ","");
System.out.println(c+" "+nom.length());
}
}
}