UXUI 웹디자인 과정_과제/2달차

[UXUI 웹디자인] 2달차 과제_22 / JS 연습문제 풀이

1. 최대값

https://ninefloor.github.io/web-practice/work/22/ex01.html

var num=[10,20,5,8,1,2];
var max=0;

for(var i=0; i<num.length; i++){
  if(max<num[i]){
    max=num[i];
  }
}
document.write("최대값:"+max);

2. 최소값

https://ninefloor.github.io/web-practice/work/22/ex02.html

var num=[10,20,-5,8,-1,2];
var min=0;

for(var i=0; i<num.length; i++){
  if(min>num[i]){
    min=num[i];
  }
}
document.write("최소값:"+min);

3. 피보나치 수열

https://ninefloor.github.io/web-practice/work/22/ex03.html

var num=prompt("피보나치 수열의 길이를 입력하세요(정수)");
num=Number(num);
var fibo=[0];
for(var i=0; i<num-2; i++){
  fibo[1]=1;
  fibo[i+2]=fibo[i]+fibo[i+1];
}
document.write(fibo);

4. 최대공약수

https://ninefloor.github.io/web-practice/work/22/ex04.html

var num1=prompt("최대 공약수를 구할 첫 번째 정수 입력");
var num2=prompt("최대 공약수를 구할 두 번째 정수 입력");
num1=Number(num1);
num2=Number(num2);
var num1_arr=[];
var num2_arr=[];

function make_num_arr (){
  for(var i=2; i<=num1; i++){
    if(num1%i==0){
      num1_arr.push(i);
    } 
  }
  for(var i=2; i<=num2; i++){
    if(num2%i==0){
      num2_arr.push(i);
    } 
  }
}

var com_arr=[];
function make_com_arr (){
  for(var j=0; j<num1_arr.length; j++){
    for(var k=0; k<num2_arr.length; k++){
      if(num1_arr[j]==num2_arr[k]){
        com_arr.push(num1_arr[j]);
      }
    }
  }
}

make_num_arr();
make_com_arr();

var max_com=0;
for(var i=0; i<com_arr.length; i++){
  if(max_com<com_arr[i]){
    max_com=com_arr[i];
  }
}

document.write(num1+", "+num2+"의 최대 공약수는 "+max_com+"입니다.")

5. 최소공배수

https://ninefloor.github.io/web-practice/work/22/ex05.html

var num1=prompt("최대 공배수를 구할 첫 번째 정수 입력");
var num2=prompt("최대 공배수를 구할 두 번째 정수 입력");
num1=Number(num1);
num2=Number(num2);
var num1_arr=[];
var num2_arr=[];

function make_num_arr (){
  for(var i=2; i<=num1; i++){
    if(num1%i==0){
      num1_arr.push(i);
    } 
  }
  for(var i=2; i<=num2; i++){
    if(num2%i==0){
      num2_arr.push(i);
    } 
  }
}

var com_arr=[];
function make_com_arr (){
  for(var j=0; j<num1_arr.length; j++){
    for(var k=0; k<num2_arr.length; k++){
      if(num1_arr[j]==num2_arr[k]){
        com_arr.push(num1_arr[j]);
      }
    }
  }
}

make_num_arr();
make_com_arr();

var max_com=0;
for(var i=0; i<com_arr.length; i++){
  if(max_com<com_arr[i]){
    max_com=com_arr[i];
  }
}

var min_com=num1*num2/max_com

document.write(num1+", "+num2+"의 최대 공배수는 "+min_com+"입니다.")

6. 완전수

https://ninefloor.github.io/web-practice/work/22/ex06.html

var num=prompt("완전수인지 판별할 정수를 입력하세요");
var num_arr=[];
num=Number(num);
// 약수 도출하여 배열에 넣기 (본인 제외)
for(var i=1; i<num; i++){
  if(num%i==0){
    num_arr.push(i);
  } 
}
//약수 모두 더하기
var sum=0;
for(var j=0; j<num_arr.length; j++){
  sum=sum+num_arr[j];
}
// 완전수 판별
if (sum==num){
  document.write(num+"은 완전수가 맞습니다.")
} else {
  document.write(num+"은 완전수가 아닙니다.")
}

7. 소수

https://ninefloor.github.io/web-practice/work/22/ex07.html

    function prime(){
      var num=prompt("소수인지 판별할 정수를 입력하세요");
      num=Number(num);
      if(num==2){
        document.write(num+"은 소수가 맞습니다.")
        return;
      }
      for(var i=2; i<num; i++){
        if(num%i==0){
          document.write(num+"은 소수가 아닙니다.")
          return;
        }
      }
      document.write(num+"은 소수가 맞습니다.")
    }
    prime();

8. 메르센 소수

https://ninefloor.github.io/web-practice/work/22/ex08.html

    function m_prime(n){
      if(n<=1){
        document.write(n+"은 메르센 소수가 아닙니다.");
        return;
      }
      // 메르센 수 판별
      if((n+1) & n){
        document.write(n+"은 메르센 소수가 아닙니다.");
        return;
      } else {
        // 메르센 소수 판별
        for(var i=2; i<n; i++){
          if(n%i==0){
            document.write(n+"은 메르센 소수가 아닙니다.");
            return;
          }
        }
        document.write(n+"은 메르센 소수가 맞습니다.");
      }
    }
    var num=prompt("메르센 소수인지 판별할 정수를 입력하세요");
    num=Number(num);
    m_prime(num);

메르센 소수는 제일 구하기 어려운 문제였다. 메르센 수인지 먼저 판별하고 그 수가 소수인지 판별하는 식으로 짰는데 문제는 메르센 수인지 어떻게 판별하는가... 였고, 혼자 똥꼬쇼를 한 끝에 n이 2의 제곱수인지 확인하는 쪽으로 가닥을 잡았다. 조건문은 비트 연산을 사용하는 방식인데, 이건 2의 제곱수 판별을 하는 방법을 구글에 물어보고 얻어온 귀중한 자식이다. 원래는 n & n-1 이 조건이었으나, 메르센 소수가 2**n-1이기 때문에 -1을 지워주는 식으로 변형했음.


9. 친화수

https://ninefloor.github.io/web-practice/work/22/ex09.html

function amicable(n1,n2){
  var sum1=0;
  var sum2=0;
  // n1, n2의 진약수 합 도출
  for(var i=1; i<n1; i++){
    if(n1%i==0){
      sum1=sum1+i;
    } 
  }
  for(var i=1; i<n2; i++){
    if(n2%i==0){
      sum2=sum2+i;
    } 
  }
  // 친화수 판별
  if(sum1==n2 && sum2==n1){
    document.write(n1+"과"+n2+"는 친화수가 맞습니다.");
    return;
  } else {
    document.write(n1+"과 "+n2+"는 친화수가 아닙니다.");
    return;
  }
}
var num1=prompt("친화수인지 판별 할 첫 번째 정수를 입력하세요");
var num2=prompt("친화수인지 판별 할 두 번째 정수를 입력하세요");
num1=Number(num1);
num2=Number(num2);
amicable(num1,num2);