[ 수학 ] - 약수 , 이진수
알고리즘 해본다고 ㅋㅋㅋ 몇년?십몇년?만에 수학을 ...
약수는 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);