我的代码在不同的编译器上给出了不同的结果,当我在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;
}
}