0

这是我的图:点击

我需要编写一个程序,它将找到正方形的数量(1x1),我们可以将其绘制成给定半径的圆。正方形只能完全绘制并像乐高积木一样放置 - 一个接一个。在某些情况下,正方形的顶点可以位于圆上。

示例:对于 1- 它产生 0,对于 2- 它产生四个,对于 3- 16 个正方形,对于 4-32,对于 5-52。

我已经写了一些东西,但是对于 5+(我的意思是半径大于 5)它不能正常工作。在这里:点击。在我的代码中,r 是圆的半径,sum 是所有正方形的总和,height 是我尝试“绘制”到圆中的三角形的高度(使用勾股定理)。

现在——有什么帮助吗?我的算法是否正确?我应该改变什么吗?

4

2 回答 2

2

高斯圆问题给出了一个公式来计算给定半径的圆内的整数点。您可以使用此逻辑来计算位于圆圈中的正方形。

N = 4 * Sum[i=1..R] (Floor(Sqrt((R^2-i^2)))

例子:

R = 3
i=1   n1 = Floor(Sqrt(9-1))~Floor(2.8)=2
i=2   n2 = Floor(Sqrt(9-4))~Floor(2.2)=2
i=3   n2 = Floor(Sqrt(9-9))=0
N=4*(n1+n2+n3)=16
于 2014-12-06T04:16:46.980 回答
0

首先- 半径为 5 的圆适合 60 个 1x1 正方形,而不是 52。我敢打赌,有人没有计算点 {[3,4],[3,-4],[4,3],[4 ,-3],[-4,3],[-4,-3],[-3,4],[-3,-4]} 在纸上画并用手数时,不确定它们是否就在圈子上或就在圈子外面。他们正好在圈子上。

第二——MBo 的回答把我带到了这里——我有时会在 StackOverflow 上搜索 Gauss Circle Problem,看看是否有人提出了一些新的、有趣的算法。

第三- 这是代码:

int     allSquares=0,
        squaredRadius=radius*radius,
        sideOfQuarterOfInscribedSquare=(int)(long)(radius/sqrt(2));
for(int x=sideOfQuarterOfInscribedSquare+1;
        x<radius;
        x++){
    allSquares+=(long)sqrt(squaredRadius-x*x);
}
allSquares= allSquares*8+4*sideOfQuarterOfInscribedSquare*sideOfQuarterOfInscribedSquare;
return allSquares;

它所做的只是计算圆圈八分之一内的正方形,在内接正方形之外。抱歉我的时髦格式和过于冗长的变量名。

于 2017-11-15T13:26:30.310 回答