Java 8, 485 octets
Pourrait réduire de 5 octets supplémentaires en nommant la fonction d
au lieu de divide
ou 16 octets supplémentaires si la définition de classe n'est pas comptée.
public class G{int l(String a){return a.length();}String s(String n,String m){while(l(n)>l(m))m=0+m;String a="";for(int c=1,i=l(n);i>0;c=c/10){c=n.charAt(--i)+c-m.charAt(i)+9;a=c%10+a;}return e(a);}String e(String a){return a.replaceAll("^0+(?=[0-9])","");}String divide(String n,String m){String q="",p=q,y;for(int b=0,i=0;b<=l(n);i--){y=n.substring(0,b);if(l(y)==l(p)&&p.compareTo(y)<=0||l(y)>l(p)){y=s(y,p);n=y+n.substring(b);q+=i;b=l(y)+1;i=10;p=m+0;}p=s(p,m);}return e(q)+","+n;}}
Peut être utilisé comme ceci:
public static void main(String[] args) {
G devision = new G();
System.out.println(devision.divide("20397882081197443358640281739902897356800000000",
"265252859812191058636308480000000"));
System.out.println(devision.divide("31035053229546199656252032972759319953190362094566672920420940313",
"1234567891011121314151617181920"));
System.out.println(devision.divide(
"271841734957981007420619769446411009306983931324177095509044302452019682761900886307931759877838550251114468516268739270368160832305944024022562873534438165159941045492295721222833276717171713647977188671055774220331117951120982666270758190446133158400369433755555593913760141099290463039666313245735358982466993720002701605636609796997120000000000000000000000000000000000000000000000000",
"247"));
}
céder
76899763100160,0
25138393324103249083146424239449429,62459510197626865203087816633
1100573825740813795225181252819477770473619155158611722708681386445423816849801159141424129060075102231232666057768175183676764503262931271346408394876267875141461722640873365274628650676808557279259873162169126398101692109801549256156915750794061370041981513180387019893765753438422927286098434193260562682052606153857091520795991080960000000000000000000000000000000000000000000000000,0
Non golfé:
public class ArbitraryPrecisionDivision {
/**
* Length of String
*/
int l(String a) {
return a.length();
}
/**
* substract m of n; n >= m
*/
String s(String n, String m) {
while (l(n) > l(m))
m = 0 + m;
String a = "";
for (int c = 1, i = l(n); i > 0; c = c / 10) {
c = n.charAt(--i) + c - m.charAt(i) + 9;
a = c % 10 + a;
}
return e(a);
}
/**
* trim all leading 0s
*/
String e(String a) {
return a.replaceAll("^0+(?=[0-9])", "");
}
/**
* divide n by m returning n/m,n%m; m may not start with a 0!
*/
String divide(String n, String m) {
// q stores the quotient, p stores m*i, y are the b leading digits of n
String q = "", p = q, y;
for (int b = 0, i = 0; b <= l(n); i--) {
y = n.substring(0, b);
if (l(y) == l(p) && p.compareTo(y) <= 0 || l(y) > l(p)) {
y = s(y, p);
n = y + n.substring(b);
q += i;
b = l(y) + 1;
i = 10;
p = m + 0;
}
p = s(p, m);
}
return e(q) + "," + n;
}
public static void main(String[] args) {
ArbitraryPrecisionDivision division = new ArbitraryPrecisionDivision();
System.out.println(division.divide("20397882081197443358640281739902897356800000000",
"265252859812191058636308480000000"));
System.out.println(division.divide("31035053229546199656252032972759319953190362094566672920420940313",
"1234567891011121314151617181920"));
System.out.println(division.divide(
"271841734957981007420619769446411009306983931324177095509044302452019682761900886307931759877838550251114468516268739270368160832305944024022562873534438165159941045492295721222833276717171713647977188671055774220331117951120982666270758190446133158400369433755555593913760141099290463039666313245735358982466993720002701605636609796997120000000000000000000000000000000000000000000000000",
"247"));
}
}
J'ai sacrifié un peu de vitesse en ne précalculant pas un tableau avec les m
temps 1 à 9 et en commençant par b=0
au lieu de b=l(m)
, mais j'ai économisé beaucoup d'octets en le faisant. Si vous êtes intéressé par l'ajout de précision arbitraire, voir une version précédente .
Je suppose que ce ne sera pas la solution la plus courte, mais peut-être que cela donne un bon départ.
TheConstructor
la source
la source
Réponses:
Mathematica, 251 octets
Explication
L'arithmétique sur les nombres décimaux peut facilement être implémentée par
FoldPairList
. Par exemple,imite simplement le processus de multiplication à la main.
Cas de test
signifie
123456789 / 54321= 2272...39477
.la source