My answer / AC
var gcd = function(a,b){return (!b) ? a : gcd(b, a%b);};
function mixedFraction(s){
//your code here
var p = s.split("/");
var top = p[0], bottom = p[1];
if(bottom == 0) throw ZeroDivisionError;
if(top == 0) return "0";
var sign = (top*bottom)<0 ? "-" : "";
top = top.replace(/-/, "");
bottom = bottom.replace(/-/, "");
var num = Math.floor(top/bottom);
var g = gcd(top, bottom);
var frac = g==1 ? (top-num*bottom)+"/"+bottom : ((top-num*bottom)/g)+"/"+(bottom/g);
return sign + (num?num:"") + (num && frac[0]!=0?" ":"") + (frac[0]==0?"":frac);
}
Best answer
function mixedFraction(s){
//input s will be a simple fraction i.e. "4/3", "-10/7", "-22/7"
var fraction = s.split("/").map(val => Number(val)),
numerator = fraction[0],
denominator = fraction[1],
integer = 0;
//anything divided by 0 produces an error
if (denominator === 0) {
throw new Error("Division by zero");
}
//0 divided by anything is 0
if (numerator === 0) {
return "0";
}
/* calculate gcf and divide numerator and denominator by
it to reduce improper fraction as much as possible */
var gcf = greatestCommonFactor(numerator, denominator);
numerator /= gcf;
denominator /= gcf;
/* calculate the integer and numerator for
mixed fraction; round integer down */
integer += ~~(numerator / denominator);
numerator %= denominator;
//if output is a mixed number
if (integer) {
//checks to see if fraction will be negative
if (numerator < 0 || denominator < 0) {
//integer needs proper sign
integer *= (integer < 0) ? 1 : -1;
}
return (numerator !== 0)
//integer is signed already - make numerator and denominator positive
? `${integer} ${Math.abs(numerator)}/${Math.abs(denominator)}`
: `${integer}`;
}
//if output is a simple fraction
else {
if (denominator < 0) {
//make sure numerator is negative
numerator *= (numerator < 0) ? 1 : -1;
}
return `${numerator}/${Math.abs(denominator)}`;
}
}
/* calculates gcf utilizing Euclid's algorithm
https://en.wikipedia.org/wiki/Greatest_common_divisor#Using_Euclid.27s_algorithm */
function greatestCommonFactor(a, b) {
return (b === 0) ? a : greatestCommonFactor(b, a % b);
}
好在哪?
- 解释得非常好,思路清晰,非常详尽。
-
~~(a/b)
能够得到a除以b的结果的整数部分(等于Math.floor)
Recap
- 记住辗转相除法了。
网友评论