2016-10-06 54 views
7

से बहुत तेज़ प्रिंटिंग मैं ऑनलाइन एक छोटी प्रोग्रामिंग प्रतियोगिता में भाग ले रहा हूं। असल में मैं जो करता हूं वह एक कार्य को हल करता है, एक एल्गोरिदम लिखता है और प्रतिस्पर्धा धारक के सर्वर द्वारा स्वचालित रूप से मूल्यांकन करने के लिए अपना कोड भेजता है।सी ++ प्रिंटिंग सी

सर्वर प्रोग्रामिंग भाषाओं की एक विस्तृत विविधता स्वीकार करता है। सभी कार्यों को मूल रूप से टर्मिनल से इनपुट लेने और टर्मिनल के लिए सही आउटपुट करने के लिए कार्यक्रम की आवश्यकता होती है। तो प्रतियोगिता धारक की वेबसाइट पर मैंने देखा कि वे जिन भाषाओं का समर्थन करते हैं उनमें से एक सी ++ है और वे इसे संकलित करने के लिए g ++ का उपयोग करते हैं। खैर, चूंकि मैं सी ++ में धाराप्रवाह नहीं हूं क्योंकि मैंने सोचा था कि मैं सी

में अपने उत्तरों को वापस कर दूंगा। यह पहला कार्य के लिए बहुत अच्छा काम करता है।

#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 सेकंड) के निष्पादन के समय के लिए सेट

यह मेरी सी कोड है मारा। सर्वर मेरे कार्यक्रम पर 3 अलग-अलग परीक्षण चलाता है, अलग-अलग मानों के साथ, प्रोग्राम को लंबे समय तक चलाने में अधिक वृद्धि होती है।

हालांकि, सी में यह कोड 2 सेकंड से अधिक समय लेने के कारण परीक्षणों में विफल रहा। बिना किसी लाभ के घंटों के लिए अलग-अलग समाधानों की कोशिश कर रहा है, अंततः मैंने थोड़ा कोड मुद्रण विधियों के साथ अपना कोड सी ++ के रूप में सबमिट करने का प्रयास किया।

यहाँ मेरी सी ++ मुख्य (कार्यक्रम के बाकी ज्यादातर यथावत रही) है:

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

और जब मैं इस कोड प्रस्तुत की, सभी परीक्षणों सिर्फ कुछ सौ मिलीसेकेंड प्रत्येक में पूरी तरह से भाग गया। ध्यान दें कि मैंने में अपना एल्गोरिदम नहीं बदला लेकिन केवल प्रिंटिंग।

सी ++ में प्रिंटिंग सी से बहुत तेज क्यों है? (मेरे मामले में 10x तेज) यदि यह संभव है, तो मैं इन गतियों को सी में भी कैसे प्राप्त कर सकता हूं? जैसा कि आप शायद ध्यान दें, मैं सी ++ में धाराप्रवाह नहीं हूं और पिछला कोड मुख्य रूप से पेस्ट कॉपी करता है। इस कारण से मैं सी

में प्रोग्राम करना पसंद करूंगा।

+0

इनपुट कितना बड़ा है? –

+2

'स्कैनफ़ ("% u ", &n); 'संभवतः पूरी तरह से' n' प्रारंभ नहीं हो रहा है, इसलिए लूप संभवतः कई बार चलाता है। क्या आप स्थानीय रूप से प्रोग्राम चलाने का प्रयास करते हैं यह देखने के लिए कि क्या आपको अलग व्यवहार है - जैसे कई सी प्रोग्राम में आउटपुट की अधिक लाइनें चलती हैं? –

+0

आपके कंपाइलर को आपको 'uint64_t' के साथ' "% u" 'के उपयोग के बारे में चेतावनियां देनी चाहिए। चेतावनी झंडे चालू करें! – DeiDei

उत्तर

6

ऐसा शायद इसलिए है क्योंकि आपका कोड हो सकता है (टिप्पणियां देखें) गलत है। आप %uscanf और 64-बिट पूर्णांक के साथ उपयोग नहीं कर सकते।

यहां तीसरी तालिका देखें http://www.cplusplus.com/reference/cstdio/scanf/। आपको %llu जैसे sth का उपयोग करना चाहिए।

+1

ठीक है, आप कर सकते हैं अगर 'हस्ताक्षरित int' 64 बिट्स है, लेकिन शायद यह नहीं है। –

+0

@ किथ थॉम्पसन अच्छा बिंदु। – ciechowoj

+4

इस का कारण बनता है कि 'n' के निचले हिस्से' scanf को सेट करने की यह संभव है() ', जबकि कुछ (प्रतीत होता है) यादृच्छिक मूल्य पर ऊपरी भाग छोड़ रहा है, के कारण अब तक, अभी तक भी कई पाश पुनरावृत्तियों (या इसके विपरीत)। – Dmitri

संबंधित मुद्दे