C++ 求满足不等式的正整数对的数目

C++ 求满足不等式的正整数对的数目,c++,geometry,inequality,C++,Geometry,Inequality,我试图解决一个编程问题,其中必须显示不等式x²+y²

我试图解决一个编程问题,其中必须显示不等式
x²+y²
的正整数解的数量,其中
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;
}
输出:

2
10
11
4
6

你的解决方案似乎已经很快了。减少所花费时间的主要可能性是在循环中抑制对
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;
    }
r=0;
p=sqrt(n);
如果((p*p)==n)p--;
a=p;

对于(long long i=1;i这里的
k
的目的是什么?关于
n
?正确命名变量始终是一种良好的做法。关于有效但您认为可以改进的代码,应该询问。请注意,我已将您链接到如何提问页面。您有责任阅读他们在问题中的期望发帖前。想知道为什么,如果你只使用了
i*i
,你会为
p=sqrt(n);
?请注意,sqrt返回一个双精度值,这会迫使你的作业很长时间……如果你剽窃了这个代码,那么你可以责怪别人,而不是你自己。我稍微修改了一下你的代码(摆脱了长-长)它运行得很快…你说的“加速”是什么意思?k是做什么的?程序的用户应该如何知道如何使用它?查看代码的人应该如何知道其预期用途?我已经添加了您询问的详细信息。谢谢,这使算法加快了一点。它足够快吗?仍然比时间限制要长一点。您可以详细说明它是多少吗改进了,还有多少地方需要改进?你赶时间吗?我有个主意,现在没时间了所花的时间减少了20%左右,我需要代码的运行速度是我原来的解决方案的两倍。我不赶时间,还有一点可能是我的老师不小心设置了一个有点太严格的时间限制,因为到目前为止,我班上没有人写过任何正确且不超过时间限制的解决方案。