C++ 中 pow() 函数的输出没有给出准确的答案
Output of pow() function in C++ is not giving acccurate answer
我正在尝试解决一个问题。用户将输入一个整数然后对其进行平方我必须找到 mod。但是当我给出大整数时 pow()
给出了错误的答案。我该如何解决?
#include<bits/stdc++.h>
using namespace std;
int main()
{
//ios_base:: sync_with_stdio(false);
//cin.tie(NULL);
int t;
cin>>t;
for(int i=0;i<t;i++)
{
long long n;
cin>>n;
long long sn=0;
sn=pow(n,2);
long long v = pow(10,9)+7;
cout<<sn%v<<endl;
}
}
正如评论所说,pow
适用于浮点数。因为你想对整数进行平方,所以最好使用 sn = n*n
将它们相乘。如果您使用 unsigned long long
,您将能够准确计算平方,但前提是该平方最多为 +18,446,744,073,709,551,615
(参见 https://en.m.wikipedia.org/wiki/C_data_types)
解决这个问题的诀窍是更早地计算模数。 Modular arithmetic 为此提供了一些机会。
对于这个问题,请注意 (a * b) % m == (a % m) * (b % m)
。
而且 1000000007^2 仍然适合 64 位 int,所以结果总是足够小。
因此代码的相关部分可能如下所示
const int64_t m = 1000000007;
int64_t n;
cin>>n;
n = n % m;
int64_t sn = n * n;
sn = sn % m;
cout << sn << endl;
我正在尝试解决一个问题。用户将输入一个整数然后对其进行平方我必须找到 mod。但是当我给出大整数时 pow()
给出了错误的答案。我该如何解决?
#include<bits/stdc++.h>
using namespace std;
int main()
{
//ios_base:: sync_with_stdio(false);
//cin.tie(NULL);
int t;
cin>>t;
for(int i=0;i<t;i++)
{
long long n;
cin>>n;
long long sn=0;
sn=pow(n,2);
long long v = pow(10,9)+7;
cout<<sn%v<<endl;
}
}
正如评论所说,pow
适用于浮点数。因为你想对整数进行平方,所以最好使用 sn = n*n
将它们相乘。如果您使用 unsigned long long
,您将能够准确计算平方,但前提是该平方最多为 +18,446,744,073,709,551,615
(参见 https://en.m.wikipedia.org/wiki/C_data_types)
解决这个问题的诀窍是更早地计算模数。 Modular arithmetic 为此提供了一些机会。
对于这个问题,请注意 (a * b) % m == (a % m) * (b % m)
。
而且 1000000007^2 仍然适合 64 位 int,所以结果总是足够小。
因此代码的相关部分可能如下所示
const int64_t m = 1000000007;
int64_t n;
cin>>n;
n = n % m;
int64_t sn = n * n;
sn = sn % m;
cout << sn << endl;