2010-02-25 8 views
13

मैं mpz (सी) या BigInteger (जावा) के समान वर्ग लिखने के साथ गड़बड़ कर रहा हूँ। यह सिर्फ मजेदार है, इसलिए कृपया इस बारे में मत जाओ कि मुझे अपना खुद का लेखन क्यों नहीं करना चाहिए।मैं प्रोग्राम में डिवीजन कैसे कर सकता हूं, अंक से अंक?

मैं एक वर्ग के लिए इसी तरह की है:, अब

public class HugeInt 
{ 
    public List<Integer> digits; 

    public HugeInt(String value) 
    { 
     // convert string value into its seperate digits. 
     // store them in instance variable above 
    } 
} 

ऐड() कर रहे हैं और घटाना() इस वर्ग की विधि बहुत सरल हैं। यहां एक उदाहरण दिया गया है:

private List<Integer> add(List<Integer> a, List<Integer> b) 
    { 
     List<Integer> smallerDigits = (compareDigits(a,b) < 0) ? a : b; 
     List<Integer> largerDigits = (compareDigits(a,b) >= 0) ? a : b; 
     List<Integer> result = new ArrayList<Integer>(); 

     int carry = 0; 

     for(int i = 0; i < largerDigits.size(); i++) 
     { 
      int num1 = largerDigits.get(i); 
      int num2 = (i < smallerDigits.size()) ? smallerDigits.get(i) : 0; 

      result.add((num1 + num2 + carry) % 10); 
      carry = ((num1 + num2 + carry)/10); 
     } 

     if (carry != 0) result.add(carry); 

     return result; 
    } 

इसी प्रकार, गुणा करना बहुत कठिन नहीं था।

मैं विकिपीडिया पर देखता हूं Division Algorithms पर एक पृष्ठ है, लेकिन मुझे यकीन नहीं है कि मैं जो करने की कोशिश कर रहा हूं उसके लिए कौन सा उचित है।

क्योंकि ये सकारात्मक पूर्णांक (अंकों के रूप में प्रतिनिधित्व) मनमाने ढंग से लंबे हो सकते हैं, मैं यह सुनिश्चित करना चाहता हूं कि मैं अंक-दर-अंकों के आधार पर किसी भी अन्य पर किसी भी संचालन करने का प्रयास नहीं करता हूं।

हालांकि, क्या कोई मुझे दो संख्याओं का विभाजन करने के लिए सही दिशा में इंगित कर सकता है जिसे List<Integer> के रूप में दर्शाया गया है? इसके अलावा, मैं शेष को अनदेखा कर सकता हूं क्योंकि यह पूर्णांक विभाजन है।

+0

+1: मुझे यह प्रश्न बहुत पसंद है। मैं बस इसके मजाक के लिए एक एल्गोरिदम डाल दूंगा। –

+3

Knuth का "सेमिन्यूमेरिकल एल्गोरिदम" इस विषय में बहुत विस्तार से जाता है। –

उत्तर

0

चूंकि मुझे लगता है कि आप केवल पूर्णांक विभाजन से निपट रहे हैं, यह बहुत कठिन नहीं है। गुणा दोहराया गया है, विभाजन विपरीत है - दोहराया घटाव। तो आप क्या करेंगे यह जांचें कि आप लाभांश से विभाजक को कितनी बार घटा सकते हैं। उदाहरण के लिए, 3 < 0 जा रहा बिना 10 3 बार से घटाया जा सकता है, तो पूर्णांक विभाजन भागफल 3.

+0

हालांकि यह अंक से अंक नहीं है। मुझे लगता है कि वह लंबे विभाजन का अनुकरण करना चाहता है। –

+0

मैंने इसे माना था, लेकिन माना कि यह बहुत अक्षम होगा। अब मैं सोच रहा हूं कि यह पर्याप्त होगा या यदि बिल के ने कहा, तो लंबे विभाजन को अनुकरण करना सबसे अच्छा होगा। – Mithrax

+0

@ मिथ्राक्स, हाँ, यह बहुत कम अक्षम होगा जब छोटे नंबरों से विभाजित होगा 1. आप एन बार फिर से शुरू करेंगे, जहां एन आपका बड़ा पूर्णांक होगा। (और यदि आपने अपनी गिनती को किसी अन्य बड़े पूर्णांक में नहीं देखा है, तो आपको अतिसंवेदनशील आदिम अभिन्न प्रकारों का सामना करना पड़ेगा।) –

5

तुम बस long division कर सकता है, लेकिन यह निश्चित रूप से यह (संपादित करने के लिए इष्टतम तरीका नहीं है : हालांकि ऐसा लगता है कि ऐसा कुछ करने का एक अच्छा तरीका है)। आप बड़ी पूर्णांक पुस्तकालयों के other implementations देख सकते हैं, और Googling का थोड़ा सा उपयोगी जानकारी का एक बड़ा हिस्सा बदल जाता है।

+1

+1 मजबूत Google कौशल – stacker

+2

का भुगतान करेंगे असल में, पेपर-एंड-पेंसिल लांग डिवीजन विधि काफी बड़े इंटीजर डिवीजन एल्गोरिदम सामान्य रूप से काम करने के तरीके के करीब है आकार। बहुत अधिक विस्तार करने के लिए, आप एक महत्वपूर्ण अंक का अनुमान लगाने के लिए प्रमुख अंकों का उपयोग करते हैं, फिर आंशिक शेष की गणना करें और दोहराएं। आपको पता लगाना होगा कि आपका अनुमान गलत है और इससे ठीक हो गया है। –

2

यह एक मामूली overkill हो सकता है लेकिन अगर यह चीजों की तरह आप मस्ती के लिए क्या है, आप यह पढ़ आनंद लेंगे: http://www.fizyka.umk.pl/nrbook/c20-6.pdf (है कि "अंकगणित मनमानी प्रेसिजन पर" "सी में न्यूमेरिकल व्यंजनों" है से) । अच्छी स्पष्टीकरण और कोड के बहुत सारे के साथ, इस पुस्तक में से अधिकांश के रूप में बहुत आकर्षक है।

0

यह आलेख A Larger Integer "बड़े पूर्णांक" के लिए अंकों के संचालन द्वारा अंक को कार्यान्वित करने का तरीका नहीं दिखाता है, लेकिन यह दिखाता है कि दो Int64 प्रकारों के संदर्भ में 128 बिट पूर्णांक को स्पष्ट रूप से कार्यान्वित करने का तरीका दिखाता है। मैं कल्पना करता हूं कि एक आर्बिटरी लम्बाई पूर्णांक उत्पन्न करने के लिए Int64 प्रकारों की एक सरणी का उपयोग करने के दृष्टिकोण को विस्तारित करना बहुत मुश्किल नहीं होगा। मैंने लेख पर वापस देखने में कुछ मिनट बिताए और गुणात्मक रूप से दिखने के कार्यान्वयन की तरह मनमाने ढंग से लम्बे समय तक इसमें शामिल हो सकते थे।

लेख दिखाता है कि binary division का उपयोग करके विभाजन (मात्रात्मक और शेष) को कैसे कार्यान्वित किया जाए।