Home > database >  My code gives different results on different compilers
My code gives different results on different compilers

Time:10-29

My code gives different results on different compilers, the following code gives 499999998352516354 when I enter 1,1000000000 as my input on vs code which is the desired results while it gives 499999998352516352 on codeforces

#include <bits/stdc  .h>  
using namespace std;
int main()
{
   cout<<fixed<<setprecision(90);
   long long x,y;
   long long sum=0;
   long long z=1;
   cin>>x;
   for (int i = 0; i < x; i  )
   {
      cin>>y;
      sum=y*(y 1)/2;
       z= log2(y);
       sum-=2*(pow(2,1 z)-1);
       cout<<sum<<"\n";
       sum=0;
   }
}


CodePudding user response:

Use std::llround() function around pow() and your code will work.

It is because pow() gives floating value which can be incorrectly truncated to 1 less than needed. And llround() gives correct rounding to whole integer.

Below is fixed code, I also adjusted code formatting and changed to correct necessary C headers.

Try it online!

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

int main() {
    cout << fixed << setprecision(90);
    long long x, y;
    long long sum = 0;
    long long z = 1;
    cin >> x;
    for (int i = 0; i < x; i  ) {
        cin >> y;
        sum = y * (y   1) / 2;
        z = log2(y);
        sum -= 2 * (llround(pow(2, 1   z)) - 1);
        cout << sum << "\n";
        sum = 0;
    }
}

Input:

1 1000000000

Output:

499999998352516354

As it is suggested in comments you may also use bit shifting 1LL << x instead of pow(2, x) if x is non-negative integer. And instead log2(y) if y is integer then one can use std::bit_width(y) - 1 (read about std::bit_width)

Try it online!

#include <iostream>
#include <iomanip>
#include <cmath>
#include <bit>

using namespace std;

int main() {
    cout << fixed << setprecision(90);
    long long x, y;
    long long sum = 0;
    long long z = 1;
    cin >> x;
    for (int i = 0; i < x; i  ) {
        cin >> y;
        sum = y * (y   1) / 2;
        z = std::bit_width<unsigned long long>(y) - 1;
        sum -= 2 * ((1LL << (1   z)) - 1);
        cout << sum << "\n";
        sum = 0;
    }
}
  •  Tags:  
  • c
  • Related