ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 여러가지 수학
    자료구조와 알고리즘/알고리즘 2023. 4. 11. 09:34

     

    나머지 연산:

    (a+b)%m = ((a%m)+(b%m))%m

    (a*b)%m = ((a%m)*(b%m))%m

    (a-b)%m = ((a%m)-(b%m)+m)%m; //음수나머지 나올 수 있다 -> +m한번 해주면 양수로만 나옴

    *C(JAVA)와 python 나머지 구하는 방식 차이 c와 java는 나머지를 버림, python은 내림을 이용한다.

     

    -GCD,LCM

     

    GCD -> 유클리드 호제법 O(logN)

    //재귀호출
    public int getGCD(int a, int b)
    {	if(b == 0) return a;
    	else return getGCD(b,a%b);
    }
    
    //반복문
    pulbic int getGCD(int a, int b){
    	while(b != 0){
        int r = a%b;
        a=b;
        b=r;
        }
    }

     

    N개의 수의 최대공약수 --> GCD(GCD(GCD(a,b),c),n).. 

    LCM = a*b/GCD

     

    소수찾기 

     

    1.

    public static boolean isPrime(int n){
        if(n<2) return false;
    
        for (int i = 2; i < n; i++) {
            if (n % i == 0) return false;
        }
    
        return true;

    2.

    public static boolean isPrime(int n){
        if(n<2) return false;
    
        for (int i = 2; i <= n/2; i++) {
            if (n % i == 0) return false;
        }
    
        return true;
    }

    3.

    public static boolean isPrime(int n){
        if(n<2) return false;
    
        for (int i = 2; i*i <= n; i++) {
            if (n % i == 0) return false;
        }
    
        return true;
    }

    -에라토스테네스의 체

    boolean[] isNPrime = new boolean[M+1]; //isNotPrime -> 소수면 false 짝수면 true
    int[] primeNumber = new primeNumber[M]; // 소수 저장
    int index =0;
    isNPrime[0] = isNPrime[1] = true; // 0과 1은 소수가 아니다.
    
    //소수들 저장하고 싶을 때
    for(int i=2; i<=M; i++){
        if(isNPrime[i] == false){
          primeNumber[index++] = i;
          for(int j= i+i ; j<=M; j+=i){
          isNPrime[j] = true;
          }
        }
    }
    //소수 index에 true false값 저장한 배열만 만들고 싶을 때
    for(int i=2; i*i<=M; i++){  // i의 배수는 모두 지워짐 i*i가 M을 넘어서면 검사할 필요없다.
    	if(isNPrime[i])continue; 
        for(int j= i+i ; j<=M; j+=i){ 
          isNPrime[j] = true;
          }
    }

    소수숫자를 저장하고 싶으면, i <= M의 조건식으로 i++하면서 해야겠지만, 그런게 아니라면,

    i*i<= M의 (루트M 소수찾기 검사식)을 넣어도 된다. 왜냐면, 가령 M이 110이라고 해보자.

    2의 모든 배수를 지우고나면, 3은 3*2가 이미 지워졌음으로 3*3부터 검사하면되고, 4는 4*4 ---> 10*10부터 검사하면된다 

    그 전의 값들은 이미 그 밑의 수의 배수로 지워졌기 때문이다. 따라서 M이 110이면, 10*10까지만 검사하면되지 11은 어차피 11*11부터 검사할텐데 이는 121이라 어차피 M의 범위를 넘어가므로 검사할 필요가 없다.

     

    -골드바흐 추측 -- > n = a+b --n-b도 소수 

    -팩토리얼 0의 갯수 --> 어떤 소인수를 인자로 가지고 있는 수는 그 소인수의 배수..

     

    -진법 변환 

    보통 A진법에서 B진법으로 고치려면 (각각 한자리에 표현할 수 있는 수의 범위가 0~a-1, 0~b-1임) 

    A진법을 -> 10진법으로 고치고 -> %B진법연산 뒤집으면 됨(스택이용하면 뒤집기 쉬움,o sb)

    a="12345";
    int baseA;
    int baseB;
    int Decimal;
    StringBuilder sb;
    //10진법으로 고치기
    for(int i=0; i<a.length;i++)
    {
    	Decimal += Integer.parseInt(a.charAt(i))*Math.pow(baseA,a.length-1-i));
     	
    }
    //10 to B진법으로 전환
    while( Decimal != 0){
    
    	sb.append(Decimal % baseB);
        Decimal /= baseB;
    }
    sb.reverse();

     

    2 <-> 8 , 2<->16은 비교적 더 간단함 

    2진법 3칸  <-> 8진법 1칸  

    2진법 4칸 <-> 16진법 1칸

    '자료구조와 알고리즘 > 알고리즘' 카테고리의 다른 글

    자알인 - 스택 & 큐  (0) 2024.01.30
    자알인 (1) 코딩테스트 팁  (0) 2024.01.03
    다이나믹 프로그래밍  (0) 2023.04.13
    스택과 문제들 풀면서 얻은..  (0) 2023.04.05
    프코전-자바편 1~2장  (0) 2023.03.30
Designed by Tistory.