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ę.
Jak duże jest wejście? –
'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? –
Twój kompilator powinien dać ci ostrzeżenia o użyciu '"% u "' z 'uint64_t'. Włącz flagi ostrzegawcze! – DeiDei