इस समस्या को हल करने के लिए स्पार्की का जवाब एक मानक तरीका है, लेकिन जैसा कि मैंने अपनी टिप्पणी में भी लिखा था, आप ओवरफ्लो का जोखिम उठाते हैं। यह एक व्यापक प्रकार का उपयोग करके हल किया जा सकता है, लेकिन क्या होगा यदि आप long long
एस को विभाजित करना चाहते हैं ?
नाथन अर्नस्ट का जवाब एक समाधान प्रदान करता है, लेकिन इसमें एक फ़ंक्शन कॉल, एक चर घोषणा और एक सशर्त शामिल है, जो इसे ओपीएस कोड से कम नहीं करता है और शायद धीमी भी है, क्योंकि इसे अनुकूलित करना कठिन है।
मेरा समाधान यह है:
q = (x % y) ? x / y + 1 : x / y;
यह ओपीएस कोड की तुलना में थोड़ा तेज होगा, क्योंकि मोड्यूलो और डिवीजन को प्रोसेसर पर एक ही निर्देश का उपयोग करके किया जाता है, क्योंकि कंपाइलर देख सकता है कि वे समकक्ष हैं। कम से कम gcc 4.4.1 x86 पर -O2 ध्वज के साथ यह अनुकूलन करता है।
सिद्धांत रूप में संकलक नाथन अर्नस्ट के कोड में फ़ंक्शन कॉल को इनलाइन कर सकता है और एक ही चीज़ का उत्सर्जन कर सकता है, लेकिन जब मैंने इसका परीक्षण किया तो gcc ने ऐसा नहीं किया। यह इसलिए हो सकता है क्योंकि यह मानक पुस्तकालय के एकल संस्करण में संकलित कोड को टाई करेगा।
अंतिम नोट के रूप में, आधुनिक मशीन पर इस मामले में कोई भी मायने नहीं रखता है, सिवाय इसके कि आप बेहद तंग पाश में हैं और आपका सारा डेटा रजिस्टरों या एल 1-कैश में है। अन्यथा ये सभी समाधान समान रूप से तेज़ होंगे, संभवतः नाथन अर्न्स्ट के अलावा, जो कि मुख्य मेमोरी से फ़ंक्शन को प्राप्त करने के लिए काफी धीमा हो सकता है।
q = x/y + (x % y != 0);
पर्याप्त है