蓝桥杯真题:四平方和-Java版

蓝桥杯其他真题点这里👈

import java.io.*;

/*先找后两个数for(int i = 0; 2 * i * i <= n;i++)
                for(int j = i; i * i + j * j <= n;j ++)
再找前两个数  for(int i = 0;4 * i * i <= n; i ++)
                 for(int j = i;2 * (j * j + i * i) <= n;j ++)
            //这样就可以让后两个数尽量大,前两个数尽量小     这样就可以确定后两个数一定大于前两个数
            //第一次遍历到的值就是字典序列最小的值  
            //比如找后两个数(1,9)一定比 (5,5) 更早遍历到 这样就保证是字典序列 
(用st数组记录某个数是否用过,只需要记录第一次被枚举到的数),

*/
public class Main
{
    static int n;
    static int N = 5000000;
    static boolean[] st = new boolean[N];
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
    static PII[] p = new PII[N];
    //后来存储后两个数对应的下标数对
    
    public static void main(String[] args) throws IOException
    {
        n = Integer.parseInt(in.readLine());
        
        //这里两层循环可以等,是为了让他们更接近n
        for(int i = 0; 2 * i * i <= n;i++)
        {
                for(int j = i; i * i + j * j <= n;j ++)
                {
                    int x = i * i + j * j;
                    if(!st[x]){
                        st[x] = true;
                        p[x] = new PII(i,j);
                    }
                }
        }
        
        
        //从小到大枚举,第一次遇到的就是字典序列最小的
        //这里两次循环最好不要等,这样就可以尽量小
        for(int i = 0;4 * i * i < n; i ++)
        {
            for(int j = i;2 * (j * j + i * i) < n;j ++)
            {
                int t = n - j * j - i * i;
                if(st[t])
                {
                    System.out.println(i + " " + j + " " + p[t].x + " " + p[t].y);
                    return;
                }
            }
        }
        in.close();
        out.flush();
    }
    static class PII
    {
        int x,y;
        public PII(int x,int y)
        {
            this.x = x;
            this.y = y;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值