Jednak zanim doszedłem do tego, że BigDecimal nic mi nie zaokrąglił stworzyłem sobie kod do mnożenia liczb o rozmiarach ograniczonych tylko przez ilość dostępnej pamięci ;-) [działa dokładnie tak jak mnożenie BigDecimal'em ;-), ale jest moje :-)]
public String myMultiply(String x1,String x2) {
if (x1.indexOf(".")==-1) x1=x1+".0";
if (x2.indexOf(".")==-1) x2=x2+".0";
Map res = new HashMap () {
@Override
public Byte get(Object key) {
Byte o = super.get(key);
return (o!=null)?o:(Byte.valueOf((byte)0));
}
};
x1 = reverseString(x1);
x2 = reverseString(x2);
int dotPos = (x1.indexOf("."))+(x2.indexOf("."));
x1 = x1.replaceAll("\\.", "");
x2 = x2.replaceAll("\\.", "");
for (int i=0; i(); i++) {
for (int j=0; j(); j++) {
int pos = i+j;
int numA = Byte.valueOf(""+x1.charAt(i));
int numB = Byte.valueOf(""+x2.charAt(j));
int newPos = pos;
int rest = 0;
int subRes = numA*numB;
do {
int curVal = res.get(newPos);
int newVal = (subRes+curVal)%10;
rest = ((subRes+curVal) - newVal)/10;
subRes = rest;
res.put(newPos,(byte)newVal);
newPos++;
} while (rest!=0);
}
}
String result = "";
for (int i=0; i(); i++) {
result+=""+res.get(i);
}
result = result.substring(0,dotPos)+"."+result.substring(dotPos);
int pos = result.length()-1;
while (result.charAt(pos)=='0') {
pos--;
}
if (result.charAt(pos)=='.') pos++;
result = result.substring(0,pos+1);
result = reverseString(result);
return result;
}
private String reverseString(String x) {
String newX = "";
for (int idx=0; idx(); idx++) {
newX=x.charAt(idx)+newX;
}
return newX;
}
Algorytm stojący za tym mnożeniem to zwykłe mnożenie pod kreskę ;-)
Podobne postybeta
Swing - największe zło Java'y ;-)
Spectre powinno działać nawet w Java'ie ;-)
Potworność ;-) czyli mnożenie w 90 liniach ;-)
Potfór ;-) czyli generator z yield w Java'ie
Tworzenie poprawnych nazw plików :-)
Brak komentarzy:
Prześlij komentarz