圆心在(0,0)坐标半径为大整数的一个圆,求圆周上有多少坐标为整数的点

如题,前一阵有几个同学去面试回来后说又一道编程题不会,出于好奇大家就讨论了这道题,后来发现该题难度不大不过一定要动些小脑筋不然采用穷举法也确实是算不出来的。

 

由于画图实在是不在行,所以就画了一个简略的图:

 

下面给出解题的代码:

复制代码
import java.lang.Math;
public class Gj{

public static void main(String [] args)
{
    int N=0;
    long r_square=2000000000000L;  
    long r=0;
    double r_double=Math.sqrt(r_square);
    long r_long=(long)r_double;
    double y_double=0.0;
    long y_long=0;
 
    if(r_double==r_long)
    {
    r=r_long-1;
        N=N+1;
    }
    else
    {r=r_long;}
    

    for(long x=1;x<=r;x++)
    {
        y_double=Math.sqrt(r_square-x*x);
                y_long=(long)y_double;
        if(y_long==y_double)
        {   
            if(x*x+y_long*y_long==r_square)
            {    
            /*
             System.out.print(x);    
            System.out.print(", ");
            System.out.println(y_long);
            */
            N=N+1;
            }
        }
        

    }

        System.out.println(4*N);
}




}
复制代码

 

 

总体的解题思路就是采用勾股定理,给定一个整数坐标X,假设存在整数Y满足  X**2+Y**2=R**2  ,那么我们可以求出该Y值, 然后就是判断 该Y 值是否是整数。

经过验证,以上代码可以正确的求出答案。

 

 

后记,在上面的解答后 其实还可以进一步改进的,上面思路是对 1/4  圆求解,我们其实还是可以对其再切分的。

因为, 2* ( (sqrt(2)/2 * R)**2 ) == R**2 ,    也就是说   0<X<sqrt(2)/2 * R  ,   sqrt(2)/2 * R  < Y < R   ,  而这就意味着我们只需要 求  0<X<sqrt(2)/2 * R 这段距离后乘以2 便是上面  代码的效果,因为是对称的原因(当然还要验证  sqrt(2)/2 * R  是否为整数,当然这个不可能是整数的, 可以忽略)。

由于这个改进并没有提高算法的时间复杂度,只是线性的提高一倍运算速度, 代码就不放上面了。

 

posted on   Angry_Panda  阅读(1055)  评论(0编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示