2016-09-28 4 views
3

저는 현재 숫자가 5로 나눌 수있는 빈도를 확인하는 방법을 쓰고 있습니다. 예를 들어, 25는 2 회, 125는 3 회입니다.나머지 숫자는 얼마나 자주 나눌 수 있습니까?

내 코드는 정확하다고 생각하지만 항상 실제 시간보다 한 번 더 더 많은 시간을 사용할 수 있다고 명시합니다 (예 : 25 회는 세 번 잘못되었습니다).

int main() 
    { 
     div_t o; 
     int inp = 25, i = 0; 
     while(o.rem == 0){ 
     o = div(inp, 5); 
     inp = o.quot; 
     i++ 
     } 
     return 0; 
    } 

가 이미 코드를 디버깅하고 문제가 그 나머지는 이유 즉 0이 큰 경우에도 더 루프에 한 번 단계 있다는 것을 생각 :

내 접근 방식은 다음과 같다? 나는 그 주위에 내 머리를 감쌀 수 없다.

First: 25/5 = 5; Rest = 0; 
Second: 5/5 = 1; Rest = 1; - Shouldn't it stop here? 
Third: 1/5 = 0; Rest = 1; 

아 ... 알았어. 나머지가 0 인 지점은 나눗셈이 나올 때 더 큰 제로가되는 숫자로 끝날 때 도달됩니다.

해결 방법은 무엇입니까? 난 - = 1 좀 해결 것 같아 내가 깰 경우 사용하지 않도록하고 싶었다

+1

합니다. – unwind

답변

1

에서 while 루프 조건 변경 :이 방법으로

while(o.rem == 0 && inp >= 5) 

이 부문은 당신이 검사되어 그 후 중지됩니다 5 번

는 제안 : 포장하는 const 변수를 사용 5)

당신은 내가이 표준의 일부인지 확인하도록 지켜 볼 수밖에 없었 분할을 할 div()을 사용하고
+0

도움이된다면 좋음) 상단 화살표 – acornagl

+1

을 허용 할 때까지 4 분간 기다려주세요. P – gusgxrha

+0

@gusgxrha 4 분이 끝났습니다. – glglgl

2

. 제 생각에는 거의 사용하지 않는 것 같아요. 의 경우 실제로는에 신경 쓰십시오. 이것은 그런 경우가 아니므로 조금 애매하다고 생각합니다.

어쨌든, 여기 div()없이, 나는 그것을보고 기대하는 방법은 다음과 같습니다

#include <stdio.h> 

unsigned int count_factors(unsigned int n, unsigned int factor) 
{ 
    unsigned int count = 0; 
    for(; n >= factor; ++count) 
    { 
     const int remainder = n % factor; 
     if(remainder != 0) 
      break; 
     n /= factor; 
    } 
    return count; 
} 

int main(void) { 
    printf("%u\n", count_factors(17, 5)); 
    printf("%u\n", count_factors(25, 5)); 
    printf("%u\n", count_factors(125, 5)); 
    return 0; 
} 

이 인쇄 :

0 
2 
3 
+0

div 함수가 모듈러스보다 빠르다고 읽었습니다. 그게 사실이 아닌가? 나는 가능한 한 빨리 적응할 것이라고 생각했다. – gusgxrha

+0

"빠름"이 경우에는 걱정할 필요가 없다. 정확성, 청결 및 가독성이 훨씬 더 중요합니다.정확성에 관해서 : 출력이 3, 5 및 25가 아니어야합니까? – duffymo

+1

@gusgxrha 틀렸어, 표준이야, 난 기억이 안 나지만 그게 애매하다고 생각해. 필요하지 않을 때 최적화하지 마십시오. 읽기 쉽도록 코드를 개선하는 것이 좋습니다. – unwind

0

를 지금까지 내가 당신이 입력이 정수인지 알고 싶어 이해 5의 힘 (또는 일반 적으로 v == N^x)을 얻고, 그렇다면, 힘을 계산하여 반환하려합니다 (일명 x). 그렇지 않으면 정수 결과가 필요하다는 점을 제외하면 어느 정도는 logN 함수입니다.

나는 다음과 같은 코드 갈 것입니다 : 당신은`while`에 의지하기 전에`O`를 초기화하지 때문에 당신이 행동을 정의되지 않은 확신

#include <stdio.h> 

unsigned int logN_special(unsigned int v, unsigned int n) 
{ 
    unsigned int r = 0; 

    if (n == 0) return 0;   // Illegal 
    if (n == 1) return 0;   // Illegal 
    if (v < n) return 0;   // Will always give zero 
    if (n*(v/n) != v) return 0;  // Make sure that v = n^x 

    // Find the x 
    while(v != 1) 
    { 
     v /= n; 
     ++r; 
    } 
    return r; 
} 
관련 문제