2016-10-06 22 views
7

'dan çok daha hızlı bir şekilde yazdırılıyor Küçük bir programlama yarışmasına çevrimiçi olarak katılıyorum. Temel olarak yaptığım şey bir işi çözmektir, bir algoritma yazıp, yarışmacının sunucusu tarafından otomatik olarak değerlendirilmek üzere kodumu göndermektir.C++ yazdırma, C

Sunucu, çok çeşitli programlama dillerini kabul eder. Tüm görevler temel olarak programın terminalden giriş almasını ve terminale doğru bir çıkış vermesini gerektirir. Bu yüzden rekabet sahibinin web sitesinde destekledikleri dillerin C++ olduğunu ve onu derlemek için g ++ kullandıklarını fark ettim. C aksine ben C++ o akıcı değilim çünkü Eh, bu ilk görev için çok çalıştı ben C

benim cevapları döneceğini düşündüm.

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

Yani benim algoritması tanımlanır: Ancak ikinci görevi ben sürekli programı (2 saniye) yürütülme süresi için belirlenen sınırı

Bu benim C kodudur çarptı. Sunucu, programımın daha uzun süre çalışmasını sağlamak için farklı değerlerle programımda 3 farklı test çalıştırıyor.

Ancak C bu kod nedeniyle çalıştırmak için 2 saniyeden daha uzun alarak testler başarısız oldu. Boş zamanları olmayan saatlerce farklı çözümler denerken, kodumu C++ olarak biraz farklı baskı yöntemleri ile göndermeye çalıştım.

İşte ana (programın geri kalanı çoğunlukla aynı kaldı) ++ benim 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; 
} 

Ve bu kodu gönderirken, tüm testler sadece birkaç yüz milisaniye her mükemmel koştu. Algoritmamı 'da değiştirmediğimi, ancak yalnızca yazdırmayı değiştirmediğimi unutmayın.

C++ ile yazdırma neden C'den çok daha hızlıdır? (Benim durumumda 10 kata kadar daha hızlı) Mümkünse, bu hızları C'ye nasıl sağlayabilirim? Muhtemelen fark edebileceğiniz gibi, C++ 'da akıcı değilim ve önceki kod esas olarak kopyala yapıştır. Bu nedenle ben daha ziyade

şimdiden teşekkürler C.

içinde programlamak tercih ediyorum.

+0

Giriş ne kadar büyük? –

+2

'scanf ("% u ", &n);" büyük olasılıkla "n" yi başlatılamıyor, bu nedenle for döngüsü muhtemelen farklı bir sayı çalıştırıyor. Farklı davranışlar olup olmadığını görmek için programları yerel olarak çalıştırmayı denediniz - C programında çıktı fazla satır. Sizin derleyici bir 'uint64_t' ile' "% u" 'kullanılması hakkında uyarılar vermelidir –

+0

? çalıştırmak uyarı bayrakları açın! – DeiDei

cevap

6

kodunuzu olmak yanlış (yorumlara bakınız) olabilir çünkü muhtemelen. %u'u scanf ve 64 bit tam sayı ile kullanamazsınız.

Kontrol burada http://www.cplusplus.com/reference/cstdio/scanf/ üçüncü tablo. %llu gibi sth'yi kullanmalısınız.

+1

Eh, imzasız int '64 bit ise, ancak muhtemelen değil. –

+0

@KeithThompson İyi nokta. – ciechowoj

+4

Bu, 'n' nin alt kısmının 'scanf()' ile ayarlanmasına sebep olurken, üst kısmı bazı (görünüşte) rasgele değerde bırakarak, çok fazla döngü yinelemesine neden olur (veya tersi). – Dmitri