Babbage's number with C++ not showing proper results












0















I was given a question to find babbage's number (A number whose square ends with 269696, for example 99736 squared is 9947269696, thus being a Babbage Number). My implementation in C++ is provided below. It is not providing the desired results. The first result is correct, but the subsequent ones are not. I probably think that it has to do with casting, or the variables getting out of range. But upon checking with the range of unsigned long long int , I can't understand what is wrong with my code.



#include<iostream>

using namespace std;

int main(int argc, char **argv){

unsigned long long square = 0;

for(int i = 519; i < 100000; i++){

square = i*i;

if(square % 1000000 == 269696)
cout<<"Number: "<<i<<", Square: "<<square<<endl;

}

}


This is the output I'm getting :



Number: 25264, Square: 638269696
Number: 119328, Square: 1354269696
Number: 158816, Square: 18446744073162269696
Number: 186992, Square: 606269696
Number: 188008, Square: 987269696
Number: 331424, Square: 18446744071882269696
Number: 439080, Square: 18446744073227269696


I do see that the squares are also inaccurate, but I don't understand why.



Here's the list of Babbage's number



25264
99736
150264
224736
275264
349736
400264
474736
525264
599736
650264
724736
775264
849736
900264
974736










share|improve this question



























    0















    I was given a question to find babbage's number (A number whose square ends with 269696, for example 99736 squared is 9947269696, thus being a Babbage Number). My implementation in C++ is provided below. It is not providing the desired results. The first result is correct, but the subsequent ones are not. I probably think that it has to do with casting, or the variables getting out of range. But upon checking with the range of unsigned long long int , I can't understand what is wrong with my code.



    #include<iostream>

    using namespace std;

    int main(int argc, char **argv){

    unsigned long long square = 0;

    for(int i = 519; i < 100000; i++){

    square = i*i;

    if(square % 1000000 == 269696)
    cout<<"Number: "<<i<<", Square: "<<square<<endl;

    }

    }


    This is the output I'm getting :



    Number: 25264, Square: 638269696
    Number: 119328, Square: 1354269696
    Number: 158816, Square: 18446744073162269696
    Number: 186992, Square: 606269696
    Number: 188008, Square: 987269696
    Number: 331424, Square: 18446744071882269696
    Number: 439080, Square: 18446744073227269696


    I do see that the squares are also inaccurate, but I don't understand why.



    Here's the list of Babbage's number



    25264
    99736
    150264
    224736
    275264
    349736
    400264
    474736
    525264
    599736
    650264
    724736
    775264
    849736
    900264
    974736










    share|improve this question

























      0












      0








      0








      I was given a question to find babbage's number (A number whose square ends with 269696, for example 99736 squared is 9947269696, thus being a Babbage Number). My implementation in C++ is provided below. It is not providing the desired results. The first result is correct, but the subsequent ones are not. I probably think that it has to do with casting, or the variables getting out of range. But upon checking with the range of unsigned long long int , I can't understand what is wrong with my code.



      #include<iostream>

      using namespace std;

      int main(int argc, char **argv){

      unsigned long long square = 0;

      for(int i = 519; i < 100000; i++){

      square = i*i;

      if(square % 1000000 == 269696)
      cout<<"Number: "<<i<<", Square: "<<square<<endl;

      }

      }


      This is the output I'm getting :



      Number: 25264, Square: 638269696
      Number: 119328, Square: 1354269696
      Number: 158816, Square: 18446744073162269696
      Number: 186992, Square: 606269696
      Number: 188008, Square: 987269696
      Number: 331424, Square: 18446744071882269696
      Number: 439080, Square: 18446744073227269696


      I do see that the squares are also inaccurate, but I don't understand why.



      Here's the list of Babbage's number



      25264
      99736
      150264
      224736
      275264
      349736
      400264
      474736
      525264
      599736
      650264
      724736
      775264
      849736
      900264
      974736










      share|improve this question














      I was given a question to find babbage's number (A number whose square ends with 269696, for example 99736 squared is 9947269696, thus being a Babbage Number). My implementation in C++ is provided below. It is not providing the desired results. The first result is correct, but the subsequent ones are not. I probably think that it has to do with casting, or the variables getting out of range. But upon checking with the range of unsigned long long int , I can't understand what is wrong with my code.



      #include<iostream>

      using namespace std;

      int main(int argc, char **argv){

      unsigned long long square = 0;

      for(int i = 519; i < 100000; i++){

      square = i*i;

      if(square % 1000000 == 269696)
      cout<<"Number: "<<i<<", Square: "<<square<<endl;

      }

      }


      This is the output I'm getting :



      Number: 25264, Square: 638269696
      Number: 119328, Square: 1354269696
      Number: 158816, Square: 18446744073162269696
      Number: 186992, Square: 606269696
      Number: 188008, Square: 987269696
      Number: 331424, Square: 18446744071882269696
      Number: 439080, Square: 18446744073227269696


      I do see that the squares are also inaccurate, but I don't understand why.



      Here's the list of Babbage's number



      25264
      99736
      150264
      224736
      275264
      349736
      400264
      474736
      525264
      599736
      650264
      724736
      775264
      849736
      900264
      974736







      c++






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 21 '18 at 6:56









      Anshul KumarAnshul Kumar

      11




      11
























          3 Answers
          3






          active

          oldest

          votes


















          2














          The variable i is a signed int. Since e.g. 99736 * 99736 is much larger than even an unsigned int can handle on all common platforms you will have arithmetic overflow by the multiplication, and for signed integer types that leads to undefined behavior.



          You need to make i an unsigned long long as well.






          share|improve this answer































            0














            You have to change the data type of variable i from signed integer to unsigned integer. You are getting the wrong square of the number because of integer overflow



            size_t square = 0;

            for(size_t i = 519; i < 100000; i++){
            square = i*i;
            if(square % 1000000 == 269696)
            cout<<"Number: "<<i<<", Square: "<< square <<"n";
            }


            As pointed by Some Programmer Dude in the comment, if you are working on 32-bit machine then you need to use unsigned long long otherwise size_t will perfectly on 64-bit machine.






            share|improve this answer





















            • 2





              Considering that unsigned int on all common platforms is 32 bits, and the second Babbage number is well above nine billions, that won't be enough.

              – Some programmer dude
              Nov 21 '18 at 7:09



















            0














            Make Changes into the type of int i variable unsigned long long i.



            As when you are calculating multiplication of int * int for some ranges it's exceed the range of int may results into the undefined behaviour.






            #include<iostream>

            using namespace std;

            int main(int argc, char **argv){

            unsigned long long square = 0;

            for(unsigned long long i = 519; i < 100000; i++){

            square = i*i;

            if(square % 1000000 == 269696)
            cout<<"Number: "<<i<<", Square: "<<square<<endl;

            }

            }








            share|improve this answer

























              Your Answer






              StackExchange.ifUsing("editor", function () {
              StackExchange.using("externalEditor", function () {
              StackExchange.using("snippets", function () {
              StackExchange.snippets.init();
              });
              });
              }, "code-snippets");

              StackExchange.ready(function() {
              var channelOptions = {
              tags: "".split(" "),
              id: "1"
              };
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function() {
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled) {
              StackExchange.using("snippets", function() {
              createEditor();
              });
              }
              else {
              createEditor();
              }
              });

              function createEditor() {
              StackExchange.prepareEditor({
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: true,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: 10,
              bindNavPrevention: true,
              postfix: "",
              imageUploader: {
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              },
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              });


              }
              });














              draft saved

              draft discarded


















              StackExchange.ready(
              function () {
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53406733%2fbabbages-number-with-c-not-showing-proper-results%23new-answer', 'question_page');
              }
              );

              Post as a guest















              Required, but never shown

























              3 Answers
              3






              active

              oldest

              votes








              3 Answers
              3






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              2














              The variable i is a signed int. Since e.g. 99736 * 99736 is much larger than even an unsigned int can handle on all common platforms you will have arithmetic overflow by the multiplication, and for signed integer types that leads to undefined behavior.



              You need to make i an unsigned long long as well.






              share|improve this answer




























                2














                The variable i is a signed int. Since e.g. 99736 * 99736 is much larger than even an unsigned int can handle on all common platforms you will have arithmetic overflow by the multiplication, and for signed integer types that leads to undefined behavior.



                You need to make i an unsigned long long as well.






                share|improve this answer


























                  2












                  2








                  2







                  The variable i is a signed int. Since e.g. 99736 * 99736 is much larger than even an unsigned int can handle on all common platforms you will have arithmetic overflow by the multiplication, and for signed integer types that leads to undefined behavior.



                  You need to make i an unsigned long long as well.






                  share|improve this answer













                  The variable i is a signed int. Since e.g. 99736 * 99736 is much larger than even an unsigned int can handle on all common platforms you will have arithmetic overflow by the multiplication, and for signed integer types that leads to undefined behavior.



                  You need to make i an unsigned long long as well.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Nov 21 '18 at 7:02









                  Some programmer dudeSome programmer dude

                  303k25265426




                  303k25265426

























                      0














                      You have to change the data type of variable i from signed integer to unsigned integer. You are getting the wrong square of the number because of integer overflow



                      size_t square = 0;

                      for(size_t i = 519; i < 100000; i++){
                      square = i*i;
                      if(square % 1000000 == 269696)
                      cout<<"Number: "<<i<<", Square: "<< square <<"n";
                      }


                      As pointed by Some Programmer Dude in the comment, if you are working on 32-bit machine then you need to use unsigned long long otherwise size_t will perfectly on 64-bit machine.






                      share|improve this answer





















                      • 2





                        Considering that unsigned int on all common platforms is 32 bits, and the second Babbage number is well above nine billions, that won't be enough.

                        – Some programmer dude
                        Nov 21 '18 at 7:09
















                      0














                      You have to change the data type of variable i from signed integer to unsigned integer. You are getting the wrong square of the number because of integer overflow



                      size_t square = 0;

                      for(size_t i = 519; i < 100000; i++){
                      square = i*i;
                      if(square % 1000000 == 269696)
                      cout<<"Number: "<<i<<", Square: "<< square <<"n";
                      }


                      As pointed by Some Programmer Dude in the comment, if you are working on 32-bit machine then you need to use unsigned long long otherwise size_t will perfectly on 64-bit machine.






                      share|improve this answer





















                      • 2





                        Considering that unsigned int on all common platforms is 32 bits, and the second Babbage number is well above nine billions, that won't be enough.

                        – Some programmer dude
                        Nov 21 '18 at 7:09














                      0












                      0








                      0







                      You have to change the data type of variable i from signed integer to unsigned integer. You are getting the wrong square of the number because of integer overflow



                      size_t square = 0;

                      for(size_t i = 519; i < 100000; i++){
                      square = i*i;
                      if(square % 1000000 == 269696)
                      cout<<"Number: "<<i<<", Square: "<< square <<"n";
                      }


                      As pointed by Some Programmer Dude in the comment, if you are working on 32-bit machine then you need to use unsigned long long otherwise size_t will perfectly on 64-bit machine.






                      share|improve this answer















                      You have to change the data type of variable i from signed integer to unsigned integer. You are getting the wrong square of the number because of integer overflow



                      size_t square = 0;

                      for(size_t i = 519; i < 100000; i++){
                      square = i*i;
                      if(square % 1000000 == 269696)
                      cout<<"Number: "<<i<<", Square: "<< square <<"n";
                      }


                      As pointed by Some Programmer Dude in the comment, if you are working on 32-bit machine then you need to use unsigned long long otherwise size_t will perfectly on 64-bit machine.







                      share|improve this answer














                      share|improve this answer



                      share|improve this answer








                      edited Nov 21 '18 at 7:35

























                      answered Nov 21 '18 at 7:04









                      Shravan40Shravan40

                      4,37031632




                      4,37031632








                      • 2





                        Considering that unsigned int on all common platforms is 32 bits, and the second Babbage number is well above nine billions, that won't be enough.

                        – Some programmer dude
                        Nov 21 '18 at 7:09














                      • 2





                        Considering that unsigned int on all common platforms is 32 bits, and the second Babbage number is well above nine billions, that won't be enough.

                        – Some programmer dude
                        Nov 21 '18 at 7:09








                      2




                      2





                      Considering that unsigned int on all common platforms is 32 bits, and the second Babbage number is well above nine billions, that won't be enough.

                      – Some programmer dude
                      Nov 21 '18 at 7:09





                      Considering that unsigned int on all common platforms is 32 bits, and the second Babbage number is well above nine billions, that won't be enough.

                      – Some programmer dude
                      Nov 21 '18 at 7:09











                      0














                      Make Changes into the type of int i variable unsigned long long i.



                      As when you are calculating multiplication of int * int for some ranges it's exceed the range of int may results into the undefined behaviour.






                      #include<iostream>

                      using namespace std;

                      int main(int argc, char **argv){

                      unsigned long long square = 0;

                      for(unsigned long long i = 519; i < 100000; i++){

                      square = i*i;

                      if(square % 1000000 == 269696)
                      cout<<"Number: "<<i<<", Square: "<<square<<endl;

                      }

                      }








                      share|improve this answer






























                        0














                        Make Changes into the type of int i variable unsigned long long i.



                        As when you are calculating multiplication of int * int for some ranges it's exceed the range of int may results into the undefined behaviour.






                        #include<iostream>

                        using namespace std;

                        int main(int argc, char **argv){

                        unsigned long long square = 0;

                        for(unsigned long long i = 519; i < 100000; i++){

                        square = i*i;

                        if(square % 1000000 == 269696)
                        cout<<"Number: "<<i<<", Square: "<<square<<endl;

                        }

                        }








                        share|improve this answer




























                          0












                          0








                          0







                          Make Changes into the type of int i variable unsigned long long i.



                          As when you are calculating multiplication of int * int for some ranges it's exceed the range of int may results into the undefined behaviour.






                          #include<iostream>

                          using namespace std;

                          int main(int argc, char **argv){

                          unsigned long long square = 0;

                          for(unsigned long long i = 519; i < 100000; i++){

                          square = i*i;

                          if(square % 1000000 == 269696)
                          cout<<"Number: "<<i<<", Square: "<<square<<endl;

                          }

                          }








                          share|improve this answer















                          Make Changes into the type of int i variable unsigned long long i.



                          As when you are calculating multiplication of int * int for some ranges it's exceed the range of int may results into the undefined behaviour.






                          #include<iostream>

                          using namespace std;

                          int main(int argc, char **argv){

                          unsigned long long square = 0;

                          for(unsigned long long i = 519; i < 100000; i++){

                          square = i*i;

                          if(square % 1000000 == 269696)
                          cout<<"Number: "<<i<<", Square: "<<square<<endl;

                          }

                          }








                          #include<iostream>

                          using namespace std;

                          int main(int argc, char **argv){

                          unsigned long long square = 0;

                          for(unsigned long long i = 519; i < 100000; i++){

                          square = i*i;

                          if(square % 1000000 == 269696)
                          cout<<"Number: "<<i<<", Square: "<<square<<endl;

                          }

                          }





                          #include<iostream>

                          using namespace std;

                          int main(int argc, char **argv){

                          unsigned long long square = 0;

                          for(unsigned long long i = 519; i < 100000; i++){

                          square = i*i;

                          if(square % 1000000 == 269696)
                          cout<<"Number: "<<i<<", Square: "<<square<<endl;

                          }

                          }






                          share|improve this answer














                          share|improve this answer



                          share|improve this answer








                          edited Nov 23 '18 at 6:32

























                          answered Nov 21 '18 at 7:05









                          Mr. RoshanMr. Roshan

                          1,393524




                          1,393524






























                              draft saved

                              draft discarded




















































                              Thanks for contributing an answer to Stack Overflow!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid



                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.


                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function () {
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53406733%2fbabbages-number-with-c-not-showing-proper-results%23new-answer', 'question_page');
                              }
                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              Guess what letter conforming each word

                              Port of Spain

                              Run scheduled task as local user group (not BUILTIN)