無限分數:1/3、2/3、派等。
非無限分數:1/2、1/5、1/10 等。
如何檢測一個數字何時是無限小數?
uj5u.com熱心網友回復:
有趣的問題。
仔細遵循math.stackexchange.com 上這個問題中提出的智慧,我認為以下內容應該可以解決不可約分數:
function* primeFactors(n) {
let divisor = 2;
while (n >= 2) {
if (n % divisor == 0) {
yield divisor;
n = n / divisor;
} else {
divisor ;
}
}
}
const isRepeating = (n, d) => {
const fn = n % d;
if (fn === 0) {
return false;
}
return !Array.from(primeFactors(d)).every(v => v === 2 || v === 5)
}
那么,如何減少分數呢?如果你分解分子和分母,你可以找出它們有哪些共同因素,然后將分子和分母都除以這些共同因素。這是執行此操作的一種方法:
const counts = (arr) => {
return arr.reduce((acc, curr) => {
const currentCount = acc.get(curr) ?? 0;
acc.set(curr, currentCount 1)
return acc;
}, new Map())
}
const reduceFraction = (n, d) => {
const fn = Array.from(primeFactors(n));
const fd = Array.from(primeFactors(d));
const countsFn = counts(fn);
const countsFd = counts(fd);
let rn = n;
let rd = d;
countsFn.forEach((count, factor) => {
const fdCount = countsFd.get(factor) ?? 0;
const c = Math.min(fdCount, count);
for (let i = 0; i < c; i) {
rn /= factor;
rd /= factor;
}
})
return { n: rn, d: rd }
}
所以,把這一切放在一起:
function* primeFactors(n) {
let divisor = 2;
while (n >= 2) {
if (n % divisor === 0) {
yield divisor;
n = n / divisor;
} else {
divisor ;
}
}
}
const counts = (arr) => {
return arr.reduce((acc, curr) => {
var _a;
const currentCount = acc.get(curr) ?? 0;
acc.set(curr, currentCount 1);
return acc;
}, new Map());
};
const reduceFraction = (n, d) => {
const fn = Array.from(primeFactors(n));
const fd = Array.from(primeFactors(d));
const countsFn = counts(fn);
const countsFd = counts(fd);
let rn = n;
let rd = d;
countsFn.forEach((count, factor) => {
var _a;
const fdCount = countsFd.get(factor) ?? 0;
const c = Math.min(fdCount, count);
for (let i = 0; i < c; i) {
rn /= factor;
rd /= factor;
}
});
return {
n: rn,
d: rd
};
};
const isRepeating = (num, den) => {
const {
n,
d
} = reduceFraction(num, den);
const fn = n % d;
if (fn === 0) {
return false;
}
return !Array.from(primeFactors(d)).every(v => v === 2 || v === 5);
};
console.log(isRepeating(4, 3))
console.log(isRepeating(1, 140))
console.log(isRepeating(1, 2))
console.log(isRepeating(2, 50))
console.log(isRepeating(3, 15))
但是,請注意有時(由于浮點數),JS 可能不同意。
const a = 0.1;
let t = 0;
for (let i = 0; i < 10; i) {
t = a;
}
console.log(t)
uj5u.com熱心網友回復:
您可以檢測逗號后部分的 32 位浮點數的最大長度。然后通過除數,將數字除以“。” 并獲得逗號后的句號長度。如果它相同或長度 - 1,它可能是無限小數
uj5u.com熱心網友回復:
您可以使用 JavaScript 提供的 isFinite() 函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/480080.html
標籤:javascript 数学
