我正在尝试解决一个编程问题,其中我必须显示不等式x² + y² < n
的正整数解的数量,其中n
由用户给出。我已经写了一段代码,该代码似乎可以运行,但速度却不如我所愿。有什么办法可以加快速度吗?
我当前的代码:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
long long n, i, r, k, p, a;
cin >> k;
while (k--)
{
r = 0;
cin >> n;
p = sqrt(n);
for (i = 1; i <= p; i++)
{
a = sqrt(n - (i * i));
r += a;
if ((((i * i) + (a * a)) == n) && (a > 0))
{
r--;
}
}
cout << r << "\n";
}
return 0;
}
这是this task的解决方案。
英语任务:
找到不等式(x≥1, y≥1)
的自然解x²+y² < n
的数量,其中0 < n < 2147483647
。例如,对于n=10
,有4个解决方案:(1,1), (1,2), (2,1), (2,2)
。
输入
在输入的第一行中,给出了测试用例的数量k
。在接下来的k
行中,提供了n
值。
输出
在输出中,必须在单独的行中显示不等式的自然解的数量。
示例
输入:
2
10
11
输出:
4
6
答案 0 :(得分:1)
您的解决方案似乎已经很快。减少花费时间的主要可能性是在循环中禁止调用sqrt
。这是通过考虑值a = sqrt(n - (i * i))
从一次迭代到下一次迭代变化不大而获得的。
这是代码:
r = 0;
p = sqrt(n);
if ((p*p) == n) p--;
a = p;
for (long long i = 1; i <= p; i++)
{
while ((n-i*i) <= a*a) {
--a;
}
r += a;
}