0

The Problem

The answer that I get is 2091059712 (Which is incorrect). This is what I've trying to do. I also observed some of the variable 'temp' that I printed are negative. Not able to figure what am I doing wrong. Any kind of help is appreciated.

#include "iostream"
using namespace std;

int main()
{
    long int temp=1, max=1;
    string number="7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
    for (int i = 0; i < 950 ; i++)
    {
        for (int j = 0; j < 13 ; j++)
        {
            long int n=(number[i+j]*1-'0');
            temp = temp * n;
            cout<<temp<<" ";

        }
        cout<<'\n';
        if(temp>max)
            max = temp;
        temp=1;
    }
    cout<<max;
}
  • 1
    Would you happen to be on a Windows machine (where `long` is 32 bits even for 64 bit programs), or building a 32 bit application? The answer is too big to fit in a 32 bit value (even unsigned). Try using a `uint64_t` instead of `long` as a starting point. Your wrong answer happens to be pretty close to the largest signed 32 bit value (~2.1 billion), which supports my prediction. – ShadowRanger Sep 27 '20 at 04:33
  • @ShadowRanger Thanks, it worked. But I didn't understand why. Specifically, this part "where long is 32 bits even for 64 bit programs". [I am using CLion] – SutharAryan Sep 27 '20 at 05:25
  • Suggest adding link to Euler Project #8 goals. – chux - Reinstate Monica Sep 27 '20 at 05:36
  • ShadowRanger's point: The C++ Standard grants a lot of leeway for compiler implementers. Integers do not have a mandated size. The Standard specifies the minimum size of the integer type, but the only requirement on the maximum is no type can be larger than the next larger type. `long` is allowed to be as small as 32 bits and cannot be larger than a `long long`. See this page on [fundamental types for details](https://en.cppreference.com/w/cpp/language/types). If `long` is 32 bits, the number you are producing is too large to fit. – user4581301 Sep 27 '20 at 14:35
  • Often when you see the result of a computation that should only produce positive numbers result in a negative, it's a sign that you have exceeded the capacity of a signed integer type and overflowed. Overflowing a signed integer results in [Undefined Behaviour](https://en.cppreference.com/w/cpp/language/ub) and anything could happen (including looking like it works), but the typical result is data is lost and the truncated bit pattern is interpreted as the wrong number, which may be negative. – user4581301 Sep 27 '20 at 14:47

0 Answers0