JavaScript示例:1、判斷一個數是否是質數的函數;2、編寫一個可以對任意自然數進行質因數分解的函數;3、編寫代碼要求可以求兩個正整數的最大公因數以及最小公倍數。通過對699、996進行質因數分解以及求兩者的最大公約數和最小公倍數驗算編程是否正確吧。
699=3x233;996=2x2x3x83
699與996的最大公因數為3,最小公倍數為232068。
數學相關基礎詞義解釋:
1、質數:質數是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。
2、最大公因數:最大公因數又稱為最大公約數,是指兩個或多個整數中共有約數中最大的一個,a,b的最大公約數記為(a,b)。
3、最小公倍數:兩個或多個整數公有的倍數叫做它們的公倍數,其中除0以外最小的一個公倍數就叫做這幾個整數的最小公倍數,整數a,b的最小公倍數記為[a,b]。
4、關於最小公倍數與最大公約數,我們有這樣的定理:(a,b)x[a,b]=ab(a,b均為整數)。
一、判斷一個正整數是否是質數:
/* 判斷一個大於0的自然整數是否是質數分情況判斷: 思路: 1、判斷的參數x取值范圍[1,+∞); 2、若一個正整數x除以[2,x-1]區間內的所有整數,沒有數令其求模為0,那么意味着該數為質數。需要用循環。 * (1)1不是質數也不是合數; (2)[2,x-1]區間內整數采用for循環 for (var i = 2; i < x; i++){……} 循環考慮的是x>2時的情況, 需要對x=2時的情況進行單獨判斷。if(x==2){return false},只不過該判斷在后面代碼中進行合並而省去; * * */ function isPrime(x) { if (x == 1) { console.log(x + '非質數也非合數'); console.log('1') return false; } else { for (var i = 2; i < x; i++) { if (x % i == 0) { console.log(x + "不是質數"); return false; } } console.log(x + "質數"); return true; } } } console.log(x + "質數"); return true; } }
二、對正整數進行質因數分解
/* 質因數分解函數 */ /* 根據短除法的質因數分解可以用循環來模擬短除法。 * num為每次短除法的商,若商為合數,則需要用所得商進行繼續循環;若商為質數,則不必進行下輪迭代。 */ function primeFactorization(x) { var result = []; var num; /* 獲取該數的最小質因數以及該數與最小質因數的商 */ function quotient(x) { for (var i = 2; i < x; i++) { if (x % i === 0) { result.push(i); num = x / i; console.log(result); break; } }; } /* 如果商為質數,則加入result數組;否則繼續根據quotient函數繼續求商。 * */ function f(x) { if (isPrime(x)) { result.push(x); console.log(result); } else { quotient(x); if (isPrime(num) == false) { arguments.callee(num); } else { result.push(num); console.log(result); } } } f(x); return result; } primeFactorization(996);//=> [2, 2, 3, 83] primeFactorization(699);//=>[3, 233]
二、996和699最大公因數和最小公倍數
/* *indexNum為aPrime數組(較多)中元素的索引,該被索引元素為aPrime數組(較少) 中每個元素與aPrime中的元素進行匹配,來確定兩者的質數公約數。 *arrResult為求出的兩個數的質數公因數數組, *indexArr為兩個數質因數數組的組合數組 * 求出兩個數組中共同擁有的元素,通過循環較少數組中的每個值在多數組中進行檢索 */ function maxDivisor(a, b) { var arrResult = []; var arrIndex = []; var aPrime = primeFactorization(a), bPrime = primeFactorization(b); var indexArr = [aPrime, bPrime]; indexArr.sort(function (x, y) { return x.length - y.length; }); console.log(indexArr); var indexNum = 0; for (var i = 0; i < indexArr[0].length; i++) { if (indexArr[1].indexOf(indexArr[0][i], indexNum) >= 0) { indexNum = indexArr[1].indexOf(indexArr[0][i], indexNum); indexNum++; /* console.log(indexArr[0][i]); */ arrResult.push(indexArr[0][i]) /* console.log(arrResult); */ } } /* maxCommonDivisor最大公約數 */ let maxCommonDivisor = 1; if (arrResult.length > 0) { for (let i = 0; i < arrResult.length; i++) { maxCommonDivisor *= arrResult[i]; } } /* minCommonMultiple最小公倍數 */ let minCommonMultiple = a * b / maxCommonDivisor; console.log([maxCommonDivisor, minCommonMultiple]) } maxDivisor(699, 996); //=>[3, 232068]