2016-10-06 36 views
7

Biorę udział w małym konkursie programistycznym w Internecie. Zasadniczo to, co robię, polega na rozwiązaniu zadania, napisaniu algorytmu i przesłaniu kodu, który będzie automatycznie oceniany przez serwer właściciela konkurencji.Drukowanie w C++ niezwykle szybkim niż C

Serwer akceptuje szeroką gamę języków programowania. Wszystkie zadania w zasadzie wymagają, aby program pobierał dane wejściowe z terminala i wysyłał poprawne dane również do terminala. Tak więc na stronie internetowej właściciela konkurencji zauważyłem, że jednym z obsługiwanych języków jest C++ i używają g ++ do kompilacji. Cóż, skoro nie jestem biegły w C++, w przeciwieństwie do C, myślałem, że zwrócę moje odpowiedzi w C.

To działało świetnie na pierwsze zadanie. Jednak w drugim zadaniu I ciągle hit limitu określonego na czas realizacji programu (2 sekundy)

To jest mój kod 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; 
} 

Więc mój algorytm jest zdefiniowana w . Serwer wykonuje 3 różne testy mojego programu, z różnymi wartościami, najczęściej zwiększającymi się, aby program działał dłużej.

Jednak ten kod w C nie powiódł się z powodu testów trwających dłużej niż 2 sekundy. Próbując różnych rozwiązań przez wiele godzin, w końcu próbowałem przesłać mój kod jako C++ z nieco innymi metodami drukowania.

Oto mój C++ main (reszta programu przebywał w większości takie same):

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; 
} 

A kiedy złożyłam ten kod, wszystkie testy prowadził doskonale w zaledwie kilkaset milisekund każdy. Zauważ, że nie zmieniłem mojego algorytmu w , ale tylko drukowanie.

Dlaczego drukowanie w C++ jest o wiele szybsze niż w C? (w moim przypadku do 10 razy szybciej) Jeśli to możliwe, w jaki sposób mogę osiągnąć te prędkości również w C? Jak zapewne zauważysz, nie jestem biegły w C++, a poprzedni kod to głównie wklejanie. Z tego powodu wolałbym programować w C.

Z góry dziękuję.

+0

Jak duże jest wejście? –

+2

'scanf ("% u ", &n);' prawdopodobnie nie inicjalizuje całkowicie 'n', więc pętla for może być uruchamiana inną liczbę razy.Ale spróbowałeś uruchomić programy lokalnie, aby sprawdzić, czy masz różne zachowanie - jak wiele więcej linii wyjścia w uruchomionym programie C? –

+0

Twój kompilator powinien dać ci ostrzeżenia o użyciu '"% u "' z 'uint64_t'. Włącz flagi ostrzegawcze! – DeiDei

Odpowiedz

6

Jest tak prawdopodobnie dlatego, że Twój kod jest może być (patrz komentarze) niepoprawny. Nie można używać %u z scanf i 64-bitową liczbą całkowitą.

Sprawdź trzecią tabelę tutaj http://www.cplusplus.com/reference/cstdio/scanf/. Powinieneś używać czegoś takiego jak %llu.

+1

Cóż, możesz, jeśli 'unsigned int' ma 64 bity, ale prawdopodobnie tak nie jest. –

+0

@KeithThompson Dobra uwaga. – ciechowoj

+4

Jest możliwe, że powoduje to ustawienie niższej części 'n' przez' scanf() ', pozostawiając górną część na pewnej (pozornie) losowej wartości, powodując daleko, zbyt wiele iteracji pętli (lub odwrotnie). – Dmitri