【问题标题】:Find the number of pairs of positive integers satisfying the inequality找出满足不等式的正整数对的数量
【发布时间】:2018-12-04 19:35:08
【问题描述】:

我正在尝试解决一个编程问题,我必须显示不等式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²+y² &lt; n 的自然解(x≥1, y≥1) 的数量,其中0 &lt; n &lt; 2147483647。例如,n=10 有 4 个解决方案:(1,1), (1,2), (2,1), (2,2)

输入
在输入的第一行中,给出了测试用例的数量k。在接下来的k 行中,给出了n 值。

输出
在输出中,您必须在单独的行中显示不等式的自然解的数量。

示例

输入:

2
10
11

输出:

4
6

【问题讨论】:

  • 这里k的目的是什么? n 呢?正确命名变量总是一个好习惯
  • 关于代码有效但您认为可以改进的问题应该问at Code Review。请注意,我已将您链接到如何询问页面。在发布之前,您有责任阅读他们对问题的期望。
  • Your rubber duck 想知道为什么,如果你只使用i * i,你会为p = sqrt(n); 而烦恼?
  • 暂时意识到 sqrt 返回一个双精度数,您将其强制分配给 long long ...如果您剽窃了此代码,那么您可以将其归咎于您以外的其他人。我把你的代码修好了一点(摆脱了长长的),它运行得很快……你所说的“加速”是什么意思? “k”有什么作用?该程序的用户应该如何知道如何使用它?看代码的人应该如何知道预期用途是什么?
  • 我已经添加了您询问的详细信息。

标签: c++ geometry inequality


【解决方案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;
    }

【讨论】:

  • 谢谢,这加快了算法速度。
  • 速度够快吗?
  • 仍然需要比时间限制长一点。
  • 您能否详细说明改进了多少,还有多少需要改进?你很急吗 ?我有个主意,没时间了
  • 所用时间减少了大约 20%,我需要代码的运行速度大约是原始解决方案的两倍。我不着急,也有一点可能是我的老师不小心设置了太严格的时间限制,因为到目前为止,我班上没有人写出任何正确且不超过时间限制的解决方案。
猜你喜欢
  • 2020-09-03
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多