2016-10-06 9 views
7

저는 온라인으로 작은 프로그래밍 경쟁에 참여하고 있습니다. 기본적으로 내가하는 일은 과제를 해결하고, 알고리즘을 작성하고, 경쟁자의 서버가 자동으로 평가할 수 있도록 코드를 보내는 것입니다.C++ 인쇄가 C보다 훨씬 빠릅니다.

서버는 다양한 프로그래밍 언어를 허용합니다. 모든 작업은 기본적으로 프로그램이 터미널에서 입력을 받아 올바른 터미널에 출력하도록 요구합니다. 따라서 경쟁 업체 웹 사이트에서 지원하는 언어 중 하나가 C++이고 g ++을 사용하여 컴파일했습니다. 글쎄, 나는 C에 능통하지 않기 때문에 + C와는 반대로 C에서 대답을 반환 할 것이라고 생각했다.

이것은 첫 번째 작업에 유용했다.

#include <inttypes.h> 
#include <stdio.h> 
#include <stdint.h> 
#include <math.h> 
#include <stdlib.h> 

uint8_t get_bit(uint64_t k) { 
    ... 
} 

int main(int argc, char *argv[]) { 
    uint64_t n; 
    uint64_t k; 
    scanf("%u", &n); 

    uint64_t i; 
    for (i = 0; i < n; i++) { 
     scanf("%u", &k); 
     printf("%d\n", get_bit(k)); 
    } 

    return 0; 
} 

그래서 내 알고리즘 에 정의되어있다 : 그러나 두 번째 작업에서 나는 끊임없이 프로그램 (2 초) 실행 시간에 설정 한 제한

이 내 C 코드를했다. 서버는 내 프로그램에서 3 가지 다른 테스트를 실행합니다. 각기 다른 값이 사용되며 대부분 프로그램이 더 오래 실행되도록 증가합니다.

그러나 C에서이 코드는 실행하는 데 2 ​​초 이상 걸리므로 테스트에 실패했습니다. 아무 소용이없는 시간 동안 다른 솔루션을 시도, 마침내 C + +로 조금 다른 인쇄 방법으로 내 코드를 제출하려했습니다.

다음은 주요 (프로그램의 나머지 부분은 대부분 같은 체재) ++ 내 C입니다 :

int main(int argc, char *argv[]) { 
    uint64_t n; 
    uint64_t k; 
    cin >> n; 

    uint64_t i; 
    for (i = 0; i < n; i++) { 
     cin >> k; 
     cout.operator<<(get_bit(k)) << endl; 
    } 

    return 0; 
} 

을 그리고 나는이 코드를 제출하는 경우, 모든 시험은 단지 몇 백 밀리 초마다 완벽하게 달렸다. 에 알고리즘을 변경하지 않고 인쇄 만 변경했음을 유의하십시오.

C에서 인쇄하는 속도가 C보다 훨씬 빠른 이유는 무엇입니까? (내 경우 최대 10 배 빨라짐) 가능하다면 C에서 어떻게 이러한 속도를 얻을 수 있습니까? 아마 알겠지만 나는 C++에 익숙하지 않고 이전 코드는 주로 복사 붙여 넣기입니다. 이런 이유로 저는 C로 프로그램하는 것을 선호합니다.

감사합니다.

+0

입력이 얼마나 큽니까? –

+2

'scanf ("% u", &n);)''n '을 완전히 초기화하지 않았을 가능성이 있으므로 for 루프가 다른 횟수로 실행될 가능성이 있습니다. 프로그램을 로컬에서 실행하여 다른 동작이 있는지 확인 했습니까? C 프로그램의 더 많은 출력 라인을 실행 하시겠습니까? –

+0

컴파일러는''% u "'와''uint64_t'를 사용하는 것에 대한 경고를 제공해야합니다 .. 경고 플래그 켜기 – DeiDei

답변

6

코드 될 잘못된 (주석 참조) 할 수 있기 때문에 그것은 아마. %uscanf 및 64 비트 정수로 사용할 수 없습니다.

여기에서 세 번째 표를 확인하십시오 http://www.cplusplus.com/reference/cstdio/scanf/. %llu과 같이 sth를 사용해야합니다.

+1

음,'unsigned int'가 64 비트이지만, 그렇지 않을 수도 있습니다. –

+0

@KeithThompson 좋은 지적. – ciechowoj

+4

'scanf()'에 의해'n '의 하위 부분이 설정되고, 윗 부분이 (겉으로보기에는) 무작위 값으로 남게되어 너무 많은 루프 반복을 유발할 수 있습니다 (또는 그 반대). – Dmitri