जावा क्यों सोचता है कि 10 से 99 तक सभी नंबरों का उत्पाद 0 है?


131

कोड के निम्नलिखित ब्लॉक आउटपुट को 0 के रूप में देता है।

public class HelloWorld{

    public static void main(String []args){
        int product = 1;
        for (int i = 10; i <= 99; i++) {
            product *= i;
        }
        System.out.println(product);
    }
}

कृपया कोई समझा सकता है कि ऐसा क्यों होता है?


106
आप सबसे शायद एक पूर्णांक अतिप्रवाह है।
TheLostMind

68
यदि आप उत्पाद के प्रमुख कारकों पर विचार करते हैं, तो आपको 2लगभग 90 बार दिखाई देंगे । इसका मतलब है कि आपको गैर-शून्य आउटपुट प्राप्त करने के लिए कम से कम 90 बिट्स के साथ एक चर की आवश्यकता होगी। 32 और 64 दोनों 90 से कम हैं। मूल शब्दों से बड़े पूर्णांक की गणना करने के लिए, आपको अपनी चुनी हुई भाषा में जो भी बड़ा पूर्णांक वर्ग उपलब्ध है, का उपयोग करना होगा।
कास्परड

62
तकनीकी रूप से, यह 10 से 98 तक की संख्याओं का
गुणनफल है

45
क्या? क्यों इस सवाल का एक सवाल के डुप्लिकेट के रूप बंद हो गया जो की डुप्लिकेट के रूप से बंद कर दिया जा रहा है इस सवाल ?
सलमान ए

82
99 की समस्याओं और 2147483648 नहीं है 1. मिला
glenatron

जवाबों:


425

यहाँ प्रत्येक चरण में प्रोग्राम क्या है:

          1 * 10 =          10
         10 * 11 =         110
        110 * 12 =        1320
       1320 * 13 =       17160
      17160 * 14 =      240240
     240240 * 15 =     3603600
    3603600 * 16 =    57657600
   57657600 * 17 =   980179200
  980179200 * 18 =   463356416
  463356416 * 19 =   213837312
  213837312 * 20 =   -18221056
  -18221056 * 21 =  -382642176
 -382642176 * 22 =   171806720
  171806720 * 23 =  -343412736
 -343412736 * 24 =   348028928
  348028928 * 25 =   110788608
  110788608 * 26 = -1414463488
-1414463488 * 27 =   464191488
  464191488 * 28 =   112459776
  112459776 * 29 = -1033633792
-1033633792 * 30 =  -944242688
 -944242688 * 31 =   793247744
  793247744 * 32 =  -385875968
 -385875968 * 33 =   150994944
  150994944 * 34 =   838860800
  838860800 * 35 =  -704643072
 -704643072 * 36 =   402653184
  402653184 * 37 =  2013265920
 2013265920 * 38 =  -805306368
 -805306368 * 39 = -1342177280
-1342177280 * 40 = -2147483648
-2147483648 * 41 = -2147483648
-2147483648 * 42 =           0
          0 * 43 =           0
          0 * 44 =           0
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
          0 * 97 =           0
          0 * 98 =           0

ध्यान दें कि कुछ चरणों में गुणा संख्या एक छोटी संख्या (980179200 * 18 = 463356416) या गलत संकेत (213837312 * 20 = -18221056) है, यह दर्शाता है कि एक पूर्णांक अतिप्रवाह था। लेकिन शून्य कहां से आता है? पढ़ते रहिये।

यह ध्यान में रखते हुए कि intडेटा प्रकार एक 32-बिट हस्ताक्षरित , दो का पूरक पूर्णांक है, यहां प्रत्येक चरण का स्पष्टीकरण दिया गया है:

Operation         Result(1)     Binary Representation(2)                                           Result(3)
----------------  ------------  -----------------------------------------------------------------  ------------
          1 * 10            10                                                               1010            10
         10 * 11           110                                                            1101110           110
        110 * 12          1320                                                        10100101000          1320
       1320 * 13         17160                                                    100001100001000         17160
      17160 * 14        240240                                                 111010101001110000        240240
     240240 * 15       3603600                                             1101101111110010010000       3603600
    3603600 * 16      57657600                                         11011011111100100100000000      57657600
   57657600 * 17     980179200                                     111010011011000101100100000000     980179200
  980179200 * 18   17643225600                               100 00011011100111100100001000000000     463356416
  463356416 * 19    8803771904                                10 00001100101111101110011000000000     213837312
  213837312 * 20    4276746240                                   11111110111010011111100000000000     -18221056
  -18221056 * 21    -382642176  11111111111111111111111111111111 11101001001100010101100000000000    -382642176
 -382642176 * 22   -8418127872  11111111111111111111111111111110 00001010001111011001000000000000     171806720
  171806720 * 23    3951554560                                   11101011100001111111000000000000    -343412736
 -343412736 * 24   -8241905664  11111111111111111111111111111110 00010100101111101000000000000000     348028928
  348028928 * 25    8700723200                                10 00000110100110101000000000000000     110788608
  110788608 * 26    2880503808                                   10101011101100010000000000000000   -1414463488
-1414463488 * 27  -38190514176  11111111111111111111111111110111 00011011101010110000000000000000     464191488
  464191488 * 28   12997361664                                11 00000110101101000000000000000000     112459776
  112459776 * 29    3261333504                                   11000010011001000000000000000000   -1033633792
-1033633792 * 30  -31009013760  11111111111111111111111111111000 11000111101110000000000000000000    -944242688
 -944242688 * 31  -29271523328  11111111111111111111111111111001 00101111010010000000000000000000     793247744
  793247744 * 32   25383927808                               101 11101001000000000000000000000000    -385875968
 -385875968 * 33  -12733906944  11111111111111111111111111111101 00001001000000000000000000000000     150994944
  150994944 * 34    5133828096                                 1 00110010000000000000000000000000     838860800
  838860800 * 35   29360128000                               110 11010110000000000000000000000000    -704643072
 -704643072 * 36  -25367150592  11111111111111111111111111111010 00011000000000000000000000000000     402653184
  402653184 * 37   14898167808                                11 01111000000000000000000000000000    2013265920
 2013265920 * 38   76504104960                             10001 11010000000000000000000000000000    -805306368
 -805306368 * 39  -31406948352  11111111111111111111111111111000 10110000000000000000000000000000   -1342177280
-1342177280 * 40  -53687091200  11111111111111111111111111110011 10000000000000000000000000000000   -2147483648
-2147483648 * 41  -88046829568  11111111111111111111111111101011 10000000000000000000000000000000   -2147483648
-2147483648 * 42  -90194313216  11111111111111111111111111101011 00000000000000000000000000000000             0
          0 * 43             0                                                                  0             0
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
          0 * 98             0                                                                  0             0
  1. है सही परिणाम
  2. परिणाम का आंतरिक प्रतिनिधित्व है (64 बिट्स का उपयोग चित्रण के लिए किया जाता है)
  3. परिणाम 32 निचले बिट्स के दो पूरक द्वारा दर्शाया गया है

हम जानते हैं कि किसी संख्या को सम संख्या से गुणा करना:

  • बिट्स को बाईं ओर बदलता है और शून्य बिट्स को दाईं ओर जोड़ता है
  • एक समान संख्या में परिणाम

इसलिए मूल रूप से आपका प्रोग्राम एक सम संख्या को दूसरी संख्या के साथ बार-बार गुणा करता है जो परिणाम बिट्स को सही से शुरू करता है।

पुनश्च: यदि गुणन में केवल विषम संख्याएँ होती हैं तो परिणाम शून्य नहीं होगा।


15
हेक्स रिप्रेजेंटेशन ने मुझे जो कुछ यहां हो रहा था उसके इर्द-गिर्द अपना सिर लाने में मदद की। स्पष्टीकरण देने के लिए धन्यवाद!

1
हाँ, यह अधिक शिक्षाप्रद होगा यदि आपने अपने कार्यक्रम को लंबी सूची में हेक्स मानों को प्रिंट करने के लिए संशोधित किया है।
हॉट लिप्स

4
यह जवाब सही है लेकिन वहाँ है इतना ज्यादा अव्यवस्था। अंतिम पाँच पंक्तियाँ इसका दिल हैं, और कहीं भी यह वास्तव में नहीं दिखता है कि वास्तव में यह कहाँ से खेल में आता है। (लेकिन कोई इसे विशालकाय मेज से बाहर निकाल सकता है।)
रेक्स केर

6
एक और तरीका रखें, आप 2 के कारकों को जमा करते हैं। कुछ संख्याएँ आपको 12, 16 और 20 जैसे स्वयं के द्वारा 2 के कई कारक प्रदान करती हैं। 2 का प्रत्येक कारक आपके सभी बाद के परिणामों के सभी बिट्स को सही रूप से शिफ्ट कर देगा, जैसा कि शून्य छोड़ देता है। प्लेसहोल्डर। एक बार जब आप 32 बार राइट-शिफ्ट हो जाते हैं, तो आप 32 प्लेसहोल्डर शून्य के अलावा कुछ नहीं छोड़ते हैं।
कीन

2
एक समान प्रभाव आधार में भी देखा जा सकता है। लगातार पूर्णांक की किसी भी श्रृंखला को गुणा करने का प्रयास करें, हर बार जब आप संख्या को 10 से गुणा करते हैं, तो आप उत्पाद के अंत में कम से कम एक शून्य जोड़ते हैं, और उस शून्य को निकालना असंभव है पूर्णांक के गुणन द्वारा उत्पाद से। कुछ बिंदु पर, सभी n-th कम से कम महत्वपूर्ण अंक शून्य से भरे जाएंगे और यदि आप अंकगणित को एक modulo 10 ** m पर कर रहे हैं (जिसमें सब कुछ काट देने का प्रभाव है, लेकिन m-th कम से कम महत्वपूर्ण अंक, तब यह शून्य तक बदल जाएगा। इसी तरह किसी भी अन्य ठिकानों के साथ।
रेयान

70

कंप्यूटर गुणन वास्तव में modulo 2 ^ 32 हो रहा है। एक बार जब आप गुणक में दो की पर्याप्त शक्तियां जमा कर लेते हैं, तो सभी मान 0 हो जाएंगे।

यहां हमारे पास श्रृंखला में सभी सम संख्याएँ हैं, साथ ही दो की अधिकतम शक्ति है जो संख्या को विभाजित करती है, और दो की संचयी शक्ति

num   max2  total
10    2     1
12    4     3
14    2     4
16    16    8
18    2     9
20    4    11
22    2    12
24    8    15
26    2    16
28    4    18
30    2    19
32    32   24
34    2    25
36    4    27
38    2    28
40    8    31
42    2    32

42 तक का उत्पाद x * 2 ^ 32 = 0 (mod 2 ^ 32) के बराबर है। दो की शक्तियों का क्रम ग्रे कोड (अन्य चीजों के बीच) से संबंधित है, और https://oeis.org/A001511 के रूप में प्रकट होता है ।

संपादित करें: यह देखने के लिए कि इस प्रश्न के अन्य उत्तर क्यों अपूर्ण हैं, इस तथ्य पर विचार करें कि एक ही कार्यक्रम, केवल विषम पूर्णांक तक सीमित है , सभी अतिप्रवाह के बावजूद, 0 में परिवर्तित नहीं होगा ।


वाह! अंत में, सही जवाब। लोगों को इस उत्तर पर अधिक ध्यान देना चाहिए!
रेक्स केर

यह एकमात्र सही उत्तर है। अन्य सभी क्यों नहीं समझाते हैं ।
ओलिवियर ग्रेजायर

5
@ ओलिवियरग्रेगायर I असहमत; मुझे लगता है कि स्वीकृत उत्तर सही है और पूरी तरह से अच्छी व्याख्या देता है। यह एक और अधिक प्रत्यक्ष है।
डेविड जेड

1
मुझे उम्मीद है कि और लोग इस जवाब को देखेंगे। मूल कारण यहाँ बताया गया है!
लंपा

1
@ डेविड: सहमत; स्वीकृत जवाब ज्यादातर सही है - मेरी पोस्ट वास्तव में मेरे शुरुआती वाक्य के "क्यों" को संबोधित नहीं करती है। लेकिन स्वीकृत उत्तर का पास "क्यों शून्य" के उत्तर के लिए निकटतम बात है, लेकिन यह "क्यों 42" की व्याख्या नहीं करता है - 10 और 42 के बीच केवल 16 संख्याएँ हैं
user295691

34

यह एक पूर्णांक अतिप्रवाह जैसा दिखता है ।

इस पर एक नजर डालिए

BigDecimal product=new BigDecimal(1);
for(int i=10;i<99;i++){
    product=product.multiply(new BigDecimal(i));
}
System.out.println(product);

आउटपुट:

25977982938941930515945176761070443325092850981258133993315252362474391176210383043658995147728530422794328291965962468114563072000000000000000000000

आउटपुट का अब कोई intमूल्य नहीं है। फिर अतिप्रवाह के कारण आपको गलत मान मिलेगा।

यदि यह ओवरफ्लो होता है, तो यह न्यूनतम मूल्य पर वापस चला जाता है और वहां से जारी रहता है। यदि यह कम होता है, तो यह अधिकतम मूल्य पर वापस चला जाता है और वहां से जारी रहता है।

अधिक जानकारी

संपादित करें

अपने कोड को इस प्रकार बदलते हैं

int product = 1;
for (int i = 10; i < 99; i++) {
   product *= i;
   System.out.println(product);
}

बाहर रखा:

10
110
1320
17160
240240
3603600
57657600
980179200
463356416
213837312
-18221056
-382642176
171806720
-343412736
348028928
110788608
-1414463488
464191488
112459776
-1033633792
-944242688
793247744
-385875968
150994944
838860800
-704643072
402653184
2013265920
-805306368
-1342177280
-2147483648
-2147483648>>>binary representation is 11111111111111111111111111101011 10000000000000000000000000000000 
 0 >>> here binary representation will become 11111111111111111111111111101011 00000000000000000000000000000000 
 ----
 0

22

यह पूर्णांक अतिप्रवाह के कारण है। जब आप कई संख्याओं को एक साथ गुणा करते हैं, तो द्विआधारी संख्या बहुत अधिक शून्य हो जाती है। जब आपके पास एक के लिए 32 से अधिक ट्रेलिंग जीरो होते हैं int, तो यह रोल ओवर हो जाता है 0

यह कल्पना करने में आपकी सहायता करने के लिए, यहाँ हेक्स में गुणा की संख्या एक प्रकार पर गणना की गई है जो अतिप्रवाह नहीं होगी। देखें कि अनुगामी शून्य धीरे-धीरे कैसे बढ़ता है, और ध्यान दें कि एक intअंतिम 8 हेक्स-अंकों से बना है। 42 (0x2A) से गुणा करने के बाद, सभी 32 बिट्स एक intशून्य हैं!

                                     1 (int: 00000001) * 0A =
                                     A (int: 0000000A) * 0B =
                                    6E (int: 0000006E) * 0C =
                                   528 (int: 00000528) * 0D =
                                  4308 (int: 00004308) * 0E =
                                 3AA70 (int: 0003AA70) * 0F =
                                36FC90 (int: 0036FC90) * 10 =
                               36FC900 (int: 036FC900) * 11 =
                              3A6C5900 (int: 3A6C5900) * 12 =
                             41B9E4200 (int: 1B9E4200) * 13 =
                            4E0CBEE600 (int: 0CBEE600) * 14 =
                           618FEE9F800 (int: FEE9F800) * 15 =
                          800CE9315800 (int: E9315800) * 16 =
                         B011C0A3D9000 (int: 0A3D9000) * 17 =
                        FD1984EB87F000 (int: EB87F000) * 18 =
                      17BA647614BE8000 (int: 14BE8000) * 19 =
                     25133CF88069A8000 (int: 069A8000) * 1A =
                    3C3F4313D0ABB10000 (int: ABB10000) * 1B =
                   65AAC1317021BAB0000 (int: 1BAB0000) * 1C =
                  B1EAD216843B06B40000 (int: 06B40000) * 1D =
                142799CC8CFAAFC2640000 (int: C2640000) * 1E =
               25CA405F8856098C7B80000 (int: C7B80000) * 1F =
              4937DCB91826B2802F480000 (int: 2F480000) * 20 =
             926FB972304D65005E9000000 (int: E9000000) * 21 =
           12E066E7B839FA050C309000000 (int: 09000000) * 22 =
          281CDAAC677B334AB9E732000000 (int: 32000000) * 23 =
         57BF1E59225D803376A9BD6000000 (int: D6000000) * 24 =
        C56E04488D526073CAFDEA18000000 (int: 18000000) * 25 =
      1C88E69E7C6CE7F0BC56B2D578000000 (int: 78000000) * 26 =
     43C523B86782A6DBBF4DE8BAFD0000000 (int: D0000000) * 27 =
    A53087117C4E76B7A24DE747C8B0000000 (int: B0000000) * 28 =
  19CF951ABB6C428CB15C2C23375B80000000 (int: 80000000) * 29 =
 4223EE1480456A88867C311A3DDA780000000 (int: 80000000) * 2A =
AD9E50F5D0B637A6610600E4E25D7B00000000 (int: 00000000)

1
यह थोड़ा भ्रामक है। हालांकि यह सही ढंग से प्रदर्शित करता है कि यह शून्य पर क्यों जाता है, प्रत्येक मान गुणन के बाद 32-बिट इंट में आयोजित किया जाता है, इसलिए इसे प्रत्येक चरण के बाद छोटा किया जाना चाहिए। जिस तरह से आपने अपना उत्तर लिखा है, उसका तात्पर्य है कि लूप समाप्त होने तक इसे छोटा नहीं किया जाता है। बेहतर होगा कि आप प्रत्येक चरण के लिए केवल अंतिम 8 अंक दिखाए।
रयोनो

@KamikazeScotsman मैंने आपके सुझाव के आधार पर अपने उत्तर में सुधार किया है। कम निरर्थक शून्य, अधिक 32-बिट इंटेंसिटी।
टिम एस।

1
प्रत्येक चरण पर वास्तविक मान बनाम 32-बिट मान दिखाने के लिए +1, यह दर्शाते हुए कि मान छोटा किया जा रहा है ...
kwah

14

कहीं बीच में आपको 0उत्पाद के रूप में मिलता है । तो, आपका पूरा उत्पाद 0 होगा।

आपके मामले में :

for (int i = 10; i < 99; i++) {
    if (product < Integer.MAX_VALUE)
        System.out.println(product);
    product *= i;
}
// System.out.println(product);

System.out.println(-2147483648 * EvenValueOfi); // --> this is the culprit (Credits : Kocko's answer )

O/P :
1
10
110
1320
17160
240240
3603600
57657600
980179200
463356416
213837312
-18221056
-382642176
171806720
-343412736
348028928
110788608
-1414463488
464191488
112459776
-1033633792
-944242688
793247744
-385875968
150994944
838860800
-704643072
402653184
2013265920
-805306368
-1342177280  --> Multiplying this and the current value of `i` will also give -2147483648 (INT overflow)
-2147483648  --> Multiplying this and the current value of `i` will also give -2147483648 (INT overflow)

-2147483648  ->  Multiplying this and the current value of 'i' will give 0 (INT overflow)
0
0
0

हर बार जब आप आउटपुट के रूप में iप्राप्त संख्या के साथ वर्तमान मूल्य को गुणा करते हैं 0


@KickButtowski - संख्याओं को गुणा करें .. आपको पता चल जाएगा कि क्यों: P
TheLostMind

@KickButtowski - 0 को किसी भी बिंदु पर 0 ओवरफ़्लो होने के बाद किसी भी अन्य संख्या से गुणा करने पर लगातार 0 परिणाम होगा।
श्री मूस

मैंने किया था, लेकिन मुझे लगता है कि आपको अधिक जानकारीपूर्ण होना चाहिए ताकि अन्य भी सीख सकें
किक बटोस्की

@KickButtowski - जवाब अद्यतन। ओपी भाग की जाँच करें।
TheLostMind

8
@KickButtowski: ऐसा इसलिए है क्योंकि ओवरफ्लो-रैपिंग दो की शक्ति पर होती है। अनिवार्य रूप से, ओपी कंप्यूटिंग कर रहा है {10 x 11 x 12 x ... x 98} modulo 2 ^ 32। चूंकि 2 के गुणक उस उत्पाद में 32 से अधिक बार दिखाई देते हैं, इसलिए परिणाम शून्य है।
बरबाद

12

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

@Kasperd की टिप्पणी सही दिशा में जाती है। मान लीजिए कि आप सीधे संख्या के साथ नहीं बल्कि उस संख्या के प्रमुख कारकों के साथ गुणा करते हैं। बहुत से संख्याओं में एक प्रमुख कारक के रूप में 2 होंगे। बाइनरी में यह एक लेफ्ट शिफ्ट के बराबर है। कम्यूटेशन द्वारा हम पहले 2 के प्रमुख कारकों से गुणा कर सकते हैं। इसका मतलब है कि हम सिर्फ एक लेफ्ट शिफ्ट करते हैं।

जब द्विआधारी गुणन नियमों पर एक नज़र डालते हैं, तो एक ही मामला जहां 1 एक विशिष्ट अंकों की स्थिति में परिणाम होगा, जब दोनों ऑपरेंड मान एक होते हैं।

तो एक बाईं पाली का प्रभाव यह है कि जब परिणाम को और अधिक बढ़ा दिया जाता है, तो 1 की सबसे कम स्थिति होती है।

चूंकि पूर्णांक में केवल सबसे कम क्रम बिट्स होते हैं, वे सभी 0 पर सेट होंगे जब प्राइम फैक्टर 2 को अक्सर परिणाम में पर्याप्त रूप से कोट किया जाता है।

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


7

अगर मुझे यह कोड मिले तो मुझे क्या मिलेगा -

          1 * 10 =          10
         10 * 11 =         110
        110 * 12 =        1320
       1320 * 13 =       17160
      17160 * 14 =      240240
     240240 * 15 =     3603600
    3603600 * 16 =    57657600
   57657600 * 17 =   980179200
  980179200 * 18 =   463356416 <- Integer Overflow (17643225600)
  463356416 * 19 =   213837312
  213837312 * 20 =   -18221056
  -18221056 * 21 =  -382642176
 -382642176 * 22 =   171806720
  171806720 * 23 =  -343412736
 -343412736 * 24 =   348028928
  348028928 * 25 =   110788608
  110788608 * 26 = -1414463488
-1414463488 * 27 =   464191488
  464191488 * 28 =   112459776
  112459776 * 29 = -1033633792
-1033633792 * 30 =  -944242688
 -944242688 * 31 =   793247744
  793247744 * 32 =  -385875968
 -385875968 * 33 =   150994944
  150994944 * 34 =   838860800
  838860800 * 35 =  -704643072
 -704643072 * 36 =   402653184
  402653184 * 37 =  2013265920
 2013265920 * 38 =  -805306368
 -805306368 * 39 = -1342177280
-1342177280 * 40 = -2147483648
-2147483648 * 41 = -2147483648
-2147483648 * 42 =           0 <- produce 0 
          0 * 43 =           0

पूर्णांक अतिप्रवाह कारण -

980179200 * 18 =   463356416 (should be 17643225600)

17643225600 : 10000011011100111100100001000000000 <-Actual
MAX_Integer :     1111111111111111111111111111111
463356416   :     0011011100111100100001000000000 <- 32 bit Integer

उत्पादन 0 कारण -

-2147483648 * 42 =           0 (should be -90194313216)

-90194313216: 1010100000000000000000000000000000000 <- Actual
MAX_Integer :       1111111111111111111111111111111
0           :      00000000000000000000000000000000 <- 32 bit Integer

6

आखिरकार, गणना ओवरफ्लो हो जाती है, और अंततः वह अतिप्रवाह शून्य के एक उत्पाद की ओर जाता है; ऐसा तब होता है जब product == -2147483648और i == 42। इस कोड को अपने लिए सत्यापित करने का प्रयास करें (या कोड को यहां चलाएं ):

import java.math.BigInteger;

class Ideone {
    public static void main (String[] args) throws java.lang.Exception {
        System.out.println("Result: " + (-2147483648 * 42));
    }
}

एक बार शून्य होने के बाद, यह निश्चित रूप से शून्य रहता है। यहां कुछ कोड दिए गए हैं, जो अधिक सटीक परिणाम देगा (आप यहां कोड चला सकते हैं ):

import java.math.BigInteger;

class Ideone {
    public static void main (String[] args) throws java.lang.Exception {
        BigInteger p = BigInteger.valueOf(1);
        BigInteger start = BigInteger.valueOf(10);
        BigInteger end = BigInteger.valueOf(99);
        for(BigInteger i = start; i.compareTo(end) < 0; i = i.add(BigInteger.ONE)){
            p = p.multiply(i);
            System.out.println("p: " + p);
        }
        System.out.println("\nProduct: " + p);
    }
}

यह 42 वें पुनरावृत्ति से पहले अच्छी तरह से (शब्द के सटीक अर्थ में) ओवरफ्लो करता है - 19 पर यह पहले से ही ओवरफ्लो है, च से पहले (19) <f (18)
user295691

हाँ, लेकिन अतिप्रवाह 42 वें पुनरावृत्ति तक शून्य के उत्पाद में परिणत या परिणाम नहीं करता है।
ट्रेवर

मुझे लगता है कि मुझे जो मिल रहा है, वह यह है कि आप "क्यों" को संबोधित नहीं करते हैं - क्यों संचयी उत्पाद कभी 0 से होकर गुजरेगा? टिम एस का जवाब कुछ संकेत देता है कि क्यों, लेकिन असली जवाब मॉड्यूलर अंकगणित में निहित है।
user295691

सवाल यह नहीं पूछता कि उत्पाद शून्य से क्यों गुजरता है। यह पूछता है कि कोड शून्य का उत्पादन क्यों करता है। दूसरे शब्दों में, मुझे लगता है कि ओपी मॉड्यूलर भाषा की तुलना में जावा भाषा की गतिशीलता में अधिक रुचि रखता है, लेकिन शायद मैं गलत हूं। यह पहली बार नहीं होगा जब मैंने किसी के सवाल का गलत अर्थ निकाला।
ट्रेवर

उदाहरण के लिए, यदि यह कार्यक्रम 11 से 99 तक सभी विषम संख्याओं के उत्पाद को ले गया है, तो यह होगा शून्य तक नहीं पहुंचेगा। आपका जवाब वास्तव में पता नहीं है कि ऐसा क्यों होता है।
user295691

1

यह एक पूर्णांक अतिप्रवाह है।

इंट डेटा प्रकार 4 बाइट्स या 32 बिट्स है। इसलिए, 2 ^ (32 - 1) - 1 (2,147,483,647) से बड़े नंबर इस डेटा प्रकार में संग्रहीत नहीं किए जा सकते हैं। आपके संख्यात्मक मान गलत होंगे।

बहुत बड़ी संख्या के लिए, आप कक्षा का आयात और उपयोग करना चाहेंगे java.math.BigInteger:

BigInteger product = BigInteger.ONE;
for (long i = 10; i < 99; i++) 
    product = product.multiply(BigInteger.valueOf(i));
System.out.println(product.toString());

ध्यान दें: संख्यात्मक मानों के लिए जो अभी भी इंट डेटा प्रकार के लिए बहुत बड़े हैं, लेकिन 8 बाइट्स के भीतर फिट होने के लिए पर्याप्त छोटा है (2 ^ (64 - 1) - 1) से कम या बराबर मूल्य, आपको संभवतः longआदिम का उपयोग करना चाहिए ।

HackerRank की अभ्यास समस्याएं (www.hackerrank.com), जैसे कि एल्गोरिथ्म अभ्यास अनुभाग, ( https://www.hackerrank.com/domains/algorithms/warmup ) में कुछ बहुत अच्छी संख्या वाले प्रश्न शामिल होते हैं जो कैसे के लिए अच्छा अभ्यास देते हैं उपयोग करने के लिए उपयुक्त डेटा प्रकार के बारे में सोचें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.