수치의 정수 제곱 - jzoffer

1784 단어
제3 장 고 품질의 코드, 면접 문제 16, page 110
면접 문제 에 대해 만약 에 임의의 큰 숫자 를 요구한다 면 이 문 제 는 하나의 큰 문제 이다. 이때 우 리 는 문자열 이나 배열 로 큰 숫자 를 표시 하여 넘 치지 않도록 특수 한 데이터 구조 로 숫자 를 표시 해 야 한다.
우선 고려 해 야 할 것 은 일반 기능 테스트 의 테스트 사례 이다.
그 다음으로 각종 경계 값 의 테스트 사례 를 고려 해 야 한다.예 를 들 어 귀속 종료 경계
마지막 으로 가능 한 여러 가지 오류 입력, 부정적인 테스트 사례 도 고려 해 야 한다.
제목: 함수 double Power (double base, int exponent) 를 실현 하고 base 의 exponent 를 구 합 니 다.라 이브 러 리 함 수 를 사용 할 수 없 으 며, 동시에 대수 문 제 를 고려 할 필요 가 없다.
우 리 는 나 누 기 2 대신 오른쪽 연산 자 를 사용 하여 나머지 연산 자 (%) 를 비트 와 연산 자로 대체 하여 하나의 숫자 가 홀수 인지 짝수 인지 판단 했다.비트 연산 의 효율 은 곱셈 법 과 나머지 연산 의 효율 보다 훨씬 높다.
g_invalid_input = False
class Solution:

    def power_with_unsigned_exponent(self, base, exponent):
        '''          '''
        result = 1.0 #      0,          ,   1,   0    
        for _ in range(exponent):
            result *= base
        return result
    
    def fast_power_with_unsigned_exponent(self, base, exponent):
        '''          ,    ,    '''
        if exponent == 0:
            return 1.0
        if exponent == 1:
            return base
        ret = self.fast_power_with_unsigned_exponent(base, exponent >> 1)
        ret *= ret
        if exponent & 0x1:
            ret = ret * base
        return ret
    
    def power(self, base, exponent):
        global Solution.g_invalid_input
        #                   
        g_invalid_input = False
        if base = 0 and exponent < 0:
            g_invalid_input = True
            return 0.0
        unsigned_exponent = exponent if exponent >= 0 else -exponent
        ret = self.power_with_unsigned_exponent(base, unsigned_exponent)
        if exponent < 0:
            ret = 1.0 / ret
        return ret    

좋은 웹페이지 즐겨찾기