function pascalTriangle(step){
var numbers = [];
var cnt;
var plusOrMul;
var indexRef = 0;
for(var i = 1; i <= step; i++){
numbers.push(i);
if(i <= 3) continue; //1-3까지는 예외
cnt = Math.trunc(i / 2) - 1; //반복회수
plusOrMulAtEnd = i % 2 //0: 끝부분에 곱한다, 1: 끝부분에 더한다.
var j = 1;
var num;
while(j <= cnt){
endOfArray = (numbers.length - 1); //index 접근을 위해 -1
if(j == cnt && plusOrMulAtEnd == 0){
num = numbers[endOfArray - cnt] * 2;
indexRef++;
}else{
num = numbers[endOfArray - indexRef] + numbers[endOfArray - (indexRef + 1)]
}
numbers.push(num)
j++;
}
}
return numbers;
}
/*
* 중복될 숫자인경우 push 하지 않음
*/
function exceptNumber(num, arr){
for(var i = 1; i < arr.length; i++){
if(num == arr[i]) return false;
}
return true;
}
/*
* range를 받아서 range이하의 소수list를 반환한다.
*
*/
function getPrimeList(range){
function isPrime(num){
for(var i=2; i*i<=num; i++){
if(num % i == 0) return false;
}
return true;
}
var primeList = [];
for(var i = 2; i <= range; i++){
if(isPrime(i)) primeList.push(i);
}
return primeList;
}
function squared(number){
return number * number;
}
/*
* array를 입력받아서 squareFree수를 구한후 그들의 합계를 반환한다.
* 입력값은 오름차순 정렬되어있음을 가정한다.
*/
function getSquareFreeNumList(arr){
//var arr = [1, 2, 3, 4, 5, 6, 7, 10, 15, 20, 21, 35]; // 이 수들이 어떤 소수의 제곱으로도 나뉘지 않는지 확인하기..
var primeList = getPrimeList(arr[arr.length - 1])
var sum = 0;
for(var i = 0; i < arr.length; i++){
var res = true;
for(var j = 0; j < primeList.length; j++){
var squaredValue = squared(primeList[j]); //해당 수의 제곱
if(arr[i] % squaredValue == 0){
res = false;
break;
}
}
if(res) sum += arr[i];
}
return sum;
}
(function testMain(){
console.log(pascalTriangle(52));
})()
- 프로젝트 오일러 문제를 푸는데 필요한 함수를 만들어 보았다.
- - 파스칼의 삼각형에서 중복되지 않도록 n층의 모든 수를 구하려고 했으나.. 미처 고려하지 못했던 부분에서 중복이 발생했다.. 하아...ㅠㅠ
+ js에서 나눗셈 할때 소수점 첫째자리까지 구해지는것을 처음 알았다..
+ 수학적인 지식이 없다면, 결국 규칙을 찾아서 구현해야 하는데, 그 방법이 노가다 같아서 코드가 썩 마음에 들지 않았다.
'Today I learned' 카테고리의 다른 글
2020 09 26 (0) | 2020.09.26 |
---|---|
2020 09 25 (0) | 2020.09.25 |
2020 09 23 (0) | 2020.09.23 |
2020 09 21 (0) | 2020.09.21 |
2020 09 19 (0) | 2020.09.19 |
댓글