কেন জাভা মনে করে যে 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 বিট সহ একটি পরিবর্তনশীল প্রয়োজন need 32 এবং 64 উভয়ই 90 এর চেয়ে কম।
ক্যাস্পারড

62
টেকনিক্যালি, এই 10 98. থেকে সংখ্যার গুণফল হল
AShelly

45
কি? কেন এই প্রশ্নটি প্রশ্নই সদৃশ হিসাবে বন্ধ ছিল যার সদৃশ হিসাবে বন্ধ হচ্ছে এই প্রশ্ন ?
সালমান এ

82
99 সমস্যা ও 2147483648 Aint 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 বিটের দু'জনের পরিপূরক দ্বারা প্রতিনিধিত্ব করা ফলাফল

আমরা জানি যে একটি সংখ্যাকে একটি এমনকি সংখ্যার দ্বারা গুণ করে:

  • বিটগুলি বাম দিকে সরান এবং ডানদিকে শূন্য বিট যুক্ত করুন
  • একটি এমনকি সংখ্যার ফলাফল

সুতরাং মূলত আপনার প্রোগ্রামটি বারবার অন্য সংখ্যার সাথে এমন একটি সংখ্যাকে বার করে দেয় যা ফলাফল বিটটি ডান থেকে শুরু করে জিরো করে।

PS: যদি গুণগুলি বিজোড় সংখ্যার সাথে জড়িত থাকে তবে ফলাফলটি শূন্য হবে না।


15
হেক্স প্রতিনিধিত্ব হ'ল এখানে যা ঘটছে তা ঘিরে আমার মাথা পেতে সাহায্য করেছিল। স্পষ্ট করার জন্য ধন্যবাদ!

1
হ্যাঁ, আপনি যদি দীর্ঘসূত্রে হেক্স মানগুলি মুদ্রণ করতে নিজের প্রোগ্রামটি পরিবর্তন করে থাকেন তবে এটি আরও শিক্ষামূলক হবে।
হট লিকস

4
এই উত্তরটি সঠিক কিন্তু আছে তাই অনেক গোলমাল। শেষ পাঁচটি লাইন এটির কেন্দ্রস্থল এবং কোথাও এটি বাস্তবে চিত্রিত হয় নি যেখানে এটি ঠিক কীভাবে কার্যকর হয়। (তবে এটি দৈত্য টেবিল থেকে কেউ ধাঁধা দিতে পারে))
রেক্স কের

6
আরেকটি উপায়ে বলুন, আপনি ২ এর গুণককে একত্রিত করেন কিছু সংখ্যা 12, 16 এবং 20 এর মতো আপনাকে নিজেই 2 টির একাধিক কারণ দেয় 2 2 এর প্রতিটি ফ্যাক্টর আপনার পরবর্তী ফলাফলগুলির সমস্ত বিটকে ডানে স্থানান্তরিত করবে, শূন্যকে ছেড়ে দেবে প্লেসহোল্ডারগুলি। একবার আপনি 32 বার ডান স্থানান্তরিত হয়ে গেলে, 32 টি স্থানধারক শূন্য ছাড়া আপনার আর কিছুই থাকবে না।
আগ্রহী

2
বেস 10 এও একইরকম প্রভাব দেখা যায় 10 ধারাবাহিক সংখ্যার যে কোনও সিরিজকে 10 দ্বারা বিভাজ্য সংখ্যা দ্বারা গুণিত করার সময় আপনি পণ্যটির শেষে কমপক্ষে একটি শূন্য যোগ করেন এবং সেই শূন্যটি অপসারণ করা অসম্ভব impossible পূর্ণসংখ্যার গুণ দ্বারা পণ্য থেকে এক পর্যায়ে, সমস্ত এন-তমতম সংখ্যার উল্লেখযোগ্য অঙ্কগুলি শূন্যগুলিতে পূর্ণ হবে এবং আপনি যদি কোনও মডুলোর 10 ** মিটারে পাটিগণিত করছেন (যা এম-তম ন্যূনতম উল্লেখযোগ্য সংখ্যাগুলি বাদে সমস্ত কিছু কেটে ফেলতে পারে), তারপরে এটি শূন্যে পরিণত হবে। একইভাবে অন্য যে কোনও বেসের সাথে।
মিথ্যা রায়ান

70

কম্পিউটারের গুণটি 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
@ অলিভিগ্রগ্রোওয়ের সাথে আমি একমত নই; আমি মনে করি গৃহীত উত্তর সঠিক এবং এটি একটি পুরোপুরি ভাল ব্যাখ্যা দেয়। এই এক মাত্র আরও সরাসরি।
ডেভিড জেড

1
আমি আশা করি আরও লোকেরা এই উত্তরটি দেখতে পাবে। মূল কারণ এখানে বর্ণিত!
ল্যানপা

1
@ ডেভিডজেড: সম্মত; গৃহীত উত্তর বেশিরভাগই সঠিক - আমার পোস্টটি আমার খোলার বাক্যটির "কেন" সত্যিই সম্বোধন করে না। তবে গৃহীত উত্তরের নিকটতম হ'ল "কেন শূন্য" এর উত্তরের নিকটতম বিষয়, তবে এটি "কেন 42" ব্যাখ্যা করে না - 10 এবং 42 এর মধ্যে কেবল 16 টি সমান সংখ্যা রয়েছে
ব্যবহারকারী 295691

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 টি সংখ্যা দেখিয়ে দিলে ভাল হবে।
RyNo

@ কমিকাজেস্কটসম্যান আপনার পরামর্শের ভিত্তিতে আমি আমার উত্তরটি উন্নত করেছি। কম অপ্রয়োজনীয় শূন্য, আরও 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গুণান।


@ কিকবুতোভস্কি - সংখ্যাগুলি গুণ করুন .. আপনি কেন জানবেন: পি
দ্য লস্টমাইন্ড

@ কিকবাট্টোভস্কি - 0 অন্য যে কোনও সংখ্যার দ্বারা 0 দ্বারা গুণিত হওয়ার ফলে অবিচ্ছিন্নভাবে যে কোনও সময়ে 0 ওভারফ্লো 0 ফিরে আসার পরে অবিরত 0 হতে থাকবে।
মিঃ মূস

আমি করেছি তবে আমি মনে করি আপনার আরও তথ্যবহুল হওয়া উচিত যাতে
অন্যরাও

@ কিকবুতোভস্কি - উত্তর আপডেট করেছেন। ওপি অংশটি পরীক্ষা করুন।
TheLostMind

8
@ কিকবাট্টোভস্কি: এটি কারণ যে দুটি জোর দিয়ে ওভারফ্লো-মোড়ানো হয়। মূলত, ওপি 10 x 11 x 12 x ... x 98} মডুলো 2 ^ 32 গণনা করছে। যেহেতু 2 টির গুণগুলি সেই পণ্যটিতে 32 বারেরও বেশি প্রদর্শিত হয়, ফলাফলটি শূন্য।
রুখ

12

যেহেতু জাভা এবং ডিবাগ আউটপুট বাস্তবায়নের বিশদটিতে বিদ্যমান অনেকগুলি উত্তর পয়েন্ট রয়েছে তাই বাইনারি গুণনের পিছনে গণিতটি কেন তা সত্যিই উত্তর দিতে পারে।

@ ক্যাস্পার্ডের মন্তব্যটি সঠিক দিকে যায়। মনে করুন আপনি সংখ্যাটির সাথে সরাসরি গুণিত করেন না তবে পরিবর্তে সেই সংখ্যার মূল কারণগুলির সাথে। অনেকগুলি সংখ্যার চেয়ে একটি প্রধান উপাদান হিসাবে 2 থাকবে। বাইনারি এ বাম শিফ্ট সমান। চলাফেরার মাধ্যমে আমরা প্রথমে 2 এর প্রধান গুণকের সাথে গুণ করতে পারি। তার মানে আমরা কেবল একটি বাম শিফট করি।

বাইনারি গুণিত বিধিগুলির দিকে একবার নজর রাখলে, কেবলমাত্র যখন 1 টি নির্দিষ্ট অঙ্কের অবস্থানের ফলাফল দেয় যখন উভয় অপারেন্ড মান এক হয়।

সুতরাং বাম শিফটের প্রভাবটি হ'ল যে 1 টির সর্বনিম্ন বিট পজিশন যখন ফলাফলকে আরও গুণমান করা হয়।

যেহেতু পূর্ণসংখ্যায় কেবল সর্বনিম্ন অর্ডার বিট থাকে তাই মূল ফলক 2 ফলাফলের ক্ষেত্রে প্রায়শই যথেষ্ট পরিমাণে আঁকানো থাকলে সেগুলি সমস্ত 0 তে সেট করা হবে।

নোট করুন যে দুটিটির পরিপূরক প্রতিনিধিত্ব এই বিশ্লেষণের পক্ষে আগ্রহী নয়, যেহেতু গুণফলের ফলাফলের চিহ্নটি ফলাফলের সংখ্যা থেকে স্বতন্ত্রভাবে গণনা করা যেতে পারে। এর অর্থ যদি মানটি ওভারফ্লো হয়ে যায় এবং নেতিবাচক হয় তবে সর্বনিম্ন অর্ডার বিটগুলি 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 তম পুনরাবৃত্তির আগে এটি (
শব্দটির যথার্থ

হ্যাঁ, তবে ওভারফ্লো 42 তম পুনরাবৃত্ত হওয়া অবধি শূন্যের পণ্য বাড়ে না বা ফলাফল দেয় না।
ট্রেভর

আমি অনুমান করি যে আমি যা পাচ্ছি তা হ'ল আপনি "কেন" - কে কেন সম্বোধন করেন না কেন संचयी পণ্যটি কখনও 0 দিয়ে যায়? টিম এস এর উত্তর কেন তা কিছুটা ইঙ্গিত দেয় তবে আসল উত্তরটি গাণিতিক গাণিতিকের মধ্যে থাকে।
ব্যবহারকারী 295691

কেন পণ্যটি শূন্যের মধ্য দিয়ে যায় এই প্রশ্নটি জিজ্ঞাসা করে না। এটি জিজ্ঞাসা করে কেন কোডটি শূন্য করে। অন্য কথায়, আমি মনে করি ওপি জাভা ভাষার গতিশীলতায় মডুলার গাণিতিকের চেয়ে বেশি আগ্রহী, তবে সম্ভবত আমি ভুল করছি। আমি কারও প্রশ্নের ভুল ব্যাখ্যা দিয়েছি এমনটাই প্রথম নয়।
ট্রেভর 21

উদাহরণস্বরূপ, যদি এই প্রোগ্রামটি 11 থেকে 99 এর মধ্যে সমস্ত বিজোড় সংখ্যার পণ্য গ্রহণ করে, তবে এটি শূন্যে পৌঁছায় না । আপনার উত্তরটি কেন ঘটবে তা সত্যিই সম্বোধন করে না।
ব্যবহারকারী 295691

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আদিম ব্যবহার করা উচিত ।

হ্যাকারর্যাঙ্কের অনুশীলন সমস্যাগুলি (www.hackerrank.com) যেমন অ্যালগরিদম অনুশীলন বিভাগ, ( https://www.hackerrank.com/domains/algorithms/warmup ) তে খুব ভাল কিছু সংখ্যক প্রশ্ন রয়েছে যা কীভাবে সম্পর্কে ভাল অনুশীলন দেয় ব্যবহারের জন্য উপযুক্ত ডেটা টাইপ সম্পর্কে ভাবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.