我的代码在不同的编译器上给出了不同的结果

  • 本文关键字:结果 代码 编译器 c++
  • 更新时间 :
  • 英文 :


我的代码在不同的编译器上给出了不同的结果,当我在vs代码上输入1100000000作为输入时,下面的代码给出了499999998352516354,这是所需的结果,而在codeforces 上给出了4999999 98352516352

#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;
}
}

pow()周围使用std::llround((函数,您的代码就会工作。

这是因为pow((给出的浮点值可能会被错误地截断为比所需值少1。llround((对整整数进行正确的舍入。

下面是固定的代码,我还调整了代码格式,并更改为正确的C++标题。

在线试用!

#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;
}
}

输入:

1 1000000000

输出:

499999998352516354

正如评论中所建议的,如果x是非负整数,您也可以使用位移位1LL << x而不是pow(2, x)。而不是log2(y)如果y是整数,则可以使用std::bit_width(y) - 1(读取std::bit_width(

在线试用!

#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;
}
}

最新更新