विशेष रूप से: मेरे पास दो हस्ताक्षरित पूर्णांक (ए, बी) हैं और मैं गणना करना चाहता हूं (ए * बी)% UINT_MAX (UINT_MAX को अधिकतम हस्ताक्षरित int के रूप में परिभाषित किया गया है)। ऐसा करने का सबसे अच्छा तरीका क्या है?मॉड्यूलो गुणा (सी में)
पृष्ठभूमि: मुझे लिनक्स के लिए एक मॉड्यूल लिखने की आवश्यकता है जो एक ज्यामितीय अनुक्रम का अनुकरण करेगा, इससे पढ़ने से मुझे अगला तत्व (मॉड्यूलो UINT_MAX) मिलेगा, मुझे मिला एकमात्र समाधान वर्तमान तत्व को अपने आप में जोड़ना है, जोड़ते समय किया जाता है निम्नलिखित तर्क का प्रयोग:। (है कि मैं गणित अनुक्रम के लिए उपयोग)
for(int i=0; i<b; ++i){
if(UINT_MAX - current_value > difference) {
current_value += difference;
} else {
current_value = difference - (UINT_MAX - current_value);
}
जब current_value = पहले चरण में एक (और हर चरण में अद्यतन किया जाता है, और अंतर = एक (हमेशा) जाहिर है यह एक बुद्धिमान समाधान नहीं है। एक बुद्धिमान व्यक्ति यह कैसे प्राप्त करेगा?
धन्यवाद!
क्या आपको मॉड्यूलस ऑपरेटर या 8 बाइट पूर्णांक प्रकारों का उपयोग करने की अनुमति नहीं है? – davogotland
"बहुत लंबा" जहां बहुत लंबा बेवकूफ समाधान है, int से अधिक लंबा प्रकार है। लंबे समय तक परिणाम = ((लंबे समय तक) ए) * ((लंबे समय तक) बी)% ((लंबे समय तक) UINT_MAX); –
@ जोचिम इक्सक्सन परिणाम तब तक लंबे समय तक नहीं होना चाहिए, है ना? – davogotland