C 查找所有对,使x^2+;y^2=<;n^2

C 查找所有对,使x^2+;y^2=<;n^2,c,algorithm,C,Algorithm,我正试图用C编写一个算法,对于给定的自然数n将找到配对数(x,y),其中x,y是整数 x2+y2您不需要两个循环。只需在x上循环,然后就可以计算y,因为x和n都是已知的 您不需要两个循环。只需在x上循环,然后就可以计算y,因为x和n都是已知的 如果您实现了一个函数int\u sqrt(int n),该函数返回sqrt(double n)的整数部分,那么您可以通过使用该函数仅使用一个循环来处理它。但是整数平方根只存在于C++中,所以必须通过将结果转换为 int 来实现C中的一个。 编辑: 我的想

我正试图用C编写一个算法,对于给定的自然数
n
将找到配对数
(x,y)
,其中
x,y
是整数


x2+y2您不需要两个循环。只需在x上循环,然后就可以计算
y
,因为
x
n
都是已知的

您不需要两个循环。只需在x上循环,然后就可以计算
y
,因为
x
n
都是已知的

如果您实现了一个函数
int\u sqrt(int n)
,该函数返回
sqrt(double n)
的整数部分,那么您可以通过使用该函数仅使用一个循环来处理它。但是整数平方根只存在于C++中,所以必须通过将结果转换为<代码> int

来实现C中的一个。 编辑: 我的想法是:

int x=0,result=0;
while ( (n-(x*x)) >=0){
    result += int_sqrt ( n-(x*x) ) +1;
    x++;
}

这是在你接受所有整数的情况下,包括0来组成你的夫妻。

如果你实现了一个函数
int int\u sqrt(int n)
,它返回
sqrt(double n)
的整数部分,那么你可以使用这个函数只处理一个循环。但是整数平方根只存在于C++中,所以必须通过将结果转换为<代码> int

来实现C中的一个。 编辑: 我的想法是:

int x=0,result=0;
while ( (n-(x*x)) >=0){
    result += int_sqrt ( n-(x*x) ) +1;
    x++;
}

这是在你接受所有整数的情况下,包括0个使你的夫妻。

< P>只需要在边界找到点,即对于每个给定的X,最大YyMax S.T.X^ 2 +YXMAX ^ 2 2,我们也必须考虑与-x的对。这将产生以下代码:

int pairCnt = 2*n+1; /* pairs (0,-n), (0,-n+1), ..., (0,n) */
int n2 = n*n;
for (int x=1; x<=n; ++x)
{
   int y_max = (int)sqrt(n2-x*x);
   pairCnt += 2*(2*y_max+1); /* (+/-x,-y_max), ..., (+/-x,y_max) */
}
第二种算法的第一个想法是,当x增加时,只要y_max>x,y_max将最大减少1(即,我们沿着圆的内部,半径n从(0,n)开始,直到我们穿过第一个中值y=x)。当我们添加一份旋转90°的计数点副本时(即到目前为止发现的点的两倍),我们将对最大内接正方形内的点进行两次计数


这是一种n=3的可视化
*
标记感兴趣集合之外的对(
x*x+y*y>n*n=9
)。数字标记有趣集合内的配对数(<代码> x*x+y*y一个只需要在边界找到点,即对于每个给定x,最大yax x.t.x^ 2 +yxMax ^ 2 0,我们还必须考虑与-x的对。
int pairCnt = 2*n+1; /* pairs (0,-n), (0,-n+1), ..., (0,n) */
int n2 = n*n;
for (int x=1; x<=n; ++x)
{
   int y_max = (int)sqrt(n2-x*x);
   pairCnt += 2*(2*y_max+1); /* (+/-x,-y_max), ..., (+/-x,y_max) */
}
第二种算法的第一个想法是,当x增加时,只要y_max>x,y_max将最大减少1(即,我们沿着圆的内部,半径n从(0,n)开始,直到我们穿过第一个中值y=x)。当我们添加一个旋转90°的计数点副本时(即到目前为止发现的点的两倍),我们将计算最大内接正方形内的点两次



这是一种n=3的可视化。标记感兴趣集合外的对(
x*x+y*y>n*n=9
),数字标记感兴趣集合内对的频率(
x*x+y*y不是真的,他想要所有满足
x^2+y^2的y,那又怎么样?x^2+y^2@ilim他不需要打印所有的对,只需要数一数。不是真的,他想要所有满足
x^2+y^2的y,那又怎样?x^2+y^2@ilim他不需要打印所有的对,只需要数一数。摆姿势“我可以用两个for循环来实现这一点"代码将有助于澄清这一宽泛问题的细节。如果内环从
0
开始,而不是
x
@WeatherVane:正确,尽管它不会改变时间复杂度。您必须指定
x
y
的范围,它们是否为负值?它们是否为
0
>?摆出“我能用两个for循环完成此操作”的姿势代码将有助于澄清这一宽泛问题的细节。如果内环从
0
开始,而不是
x
@WeatherVane:正确,尽管它不会改变时间复杂度。您必须指定
x
y
的范围,它们是否为负值?它们是否为
0
>?计算没有重复的解决方案的数量有点棘手,但我同意单循环就足够了。这取决于(x,y)是否与(y,x)不同对于x!=y,这是数学标准的情况;但这给出了一个提示。计算没有重复项的解的数量有点棘手,但我同意一个循环就足够了。取决于(x,y)是否被认为与(y,x)不同对于x!=y,这是数学标准的情况;但这给出了一个提示。我会说“对”是指有序对,因此(0,1)不同于(1,0)。我认为如果对是指无序对{x,y},那么它实际上计数两次。好的,如果对是有序的,那么(0,1)和(1,0)算作两个解决方案。嗯,但是等等,带(i,i)和0hmm,带
n=65
,4对
(52:39),(56:33),(60:25),(63:16)
出现。
(63,16)
可能在边界处,而
(52:39),(60:25)
可能没有意思,因为它们共享倍数,但(56,33,65)不共享公共倍数。不清楚这个答案如何找到
x=56,y=33,n=65
我想说“对”指的是有序对,因此(0,1)不同于(1,0)。我想如果pair指的是无序的pair{x,y},那么它真的会计数两次。好的,如果pair是有序的,那么(0,1)和(1,0)算作两个解。嗯,等等,那么(I,I)和0Hmmm,使用
n=65
,出现4对
(52:39)、(56:33)、(60:25)、(63:16)
(63,1