코테 문제 풀어보기

[ 수학 ] - 약수 , 이진수

그냥 케이 2021. 6. 14. 22:13

알고리즘 해본다고 ㅋㅋㅋ 몇년?십몇년?만에 수학을 ...

 

 

 

약수는   n을  1 <= m <=n 사이의 m 으로 나눌경우 나머지가 0 인 몫들을 말한다.

 

EX) n =  10 일 경우 1~10 이 m 이 될 수 있고 n/m을 할했을떄 나머지 0 인 1,2,5,10 이 약수이다.

 

코드로 쓰자면 

for( int m = 1 ; m<=n ; m++){

   if( n%m == 0 )  System.out.print( "약수는 " + m ); 

}

 이렇게 나머지 연산자를 사용해서 알 수 있다.

 

근데 문제는 "약수 중 K번쨰를 구하시요" 이다.

 

사실 혼자 하다가 안되서 검색해서 답을 봤다.

답을 보고 와 ~ 어떻게 저렇게 구했지 라는 생각이 들엇다. ㅋㅋ

정답은 아래와 같앗는데 , 왜 그런지는 말로 설명은 못하겟다. 계속 숫자 대입해보면서 진짜되네..만 감탄햇다. 걍 외워야지..

for ( int m = 1 ; m <=n  ; m++){

    if(n%m == 0 ) K--;

    if(K==0) {

     System.out.print( " K  번째 약수는 " + m ); 

      break; 

 } 

}

 

다음은 이진수 이다.

이진수는 얼핏 기억이 낫다.

 

n = 8 라고 했을때 2로 나누면 몫은 4 , 나머지는 0이되고 , 몫 4를 다시 2로 나누면 나머지는 0  몫은 2가된다. 이 2를 다시 나누면 몫은 1이 되고 나머지는 0이된다 .. 1은 2로 나눌수 없으니까 이제 순서대로 나온 숫자를 문자로 더하면 0001이되는데 이 문자를 거꾸로 해주면 1000이 나오게 이게 정답이다.  

자바에서 String s = Integer.toBinaryString(n) 으로 변환도 가능하다.

2진수 뿐아니라 8진수 10진수로도 변환이가능하다 ( 입력값이 10진수일경우 ) 

Strings = Integer.toOctalString(n) ==>8 진수

Strings = Integer.toHexString(n) ==>16 진수

 

10진수를 2진수로 하나하나 바꿔주려면 ,, 아래와같이 ( 8진수면 2대신 8을,16진수면 2대신 16을)

int input= 10

String convertInput="";
 while(true){

 convertInput+=input%2+"";
 input/=2;
 if(input < 2) {
 convertInput+=input;
 break;
 }

 }
String tmp = convertInput;
 convertInput="";
 for(int m = tmp.length()-1 ; m>=0; m-- ) {
 convertInput+=tmp.charAt(m);
 }

 

 

여기까지 해보니 2진수를 10진수로 , 16진수를 10진수로 , 2진수를 8진수로 , 16진수를 2진수로 다양하게 바꿔 보고싶어졋다.

일단 2진수,8진수,16진수를 10진수로 바꿔야한다

간단하게

Integer.parseInt(n,2); 

 Integer.parseInt(n,8);

 Integer.parseInt(n,16);

 

으로 바꿀수 있다. 그다음 10진수를 다시 2,8,16진수로 바꿔줄면된다.

굳이 하나하나 바꿔주겟다고 해봤는데 머리만아팠다..

 

(2진수 to 10진수 )

Scanner sc = new Scanner(System.in);
int input = sc.nextInt();

String s = input+"";
int result = 0 ;
for(int i = 0 ; i < s.length() ; i++) {
if(i<s.length()-1) {
int  a = Integer.parseInt(s.charAt(i)+"");
if(a!=0) {
result+=(int) Math.pow(2,s.length()-i-1);
}

}else {
int  a = Integer.parseInt(s.charAt(i)+"");
result+=a;
}

}
System.out.println(result);