枚举--四平方和(蓝桥杯)

枚举的优化:1)减少枚举变量,以计算代枚举

2)使用哈希预处理可行解

            四平方和四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和。如果把0包括进去,就正好可以表示为4个数的平方和。比如:5 = 0^2 + 0^2 + 1^2 + 2^27 = 1^2 + 1^2 + 1^2 + 2^2(^符号表示乘方的意对于一个给定的正整数,可能存在多种平方和的表示法。)要求你对4个数排序:0 <= a <= b <= c <= d并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法

程序输入为一个正整数N (N<5000000)

A.分析变量范围:a:0 ~ sqrt(5000000 / 4)b:0 ~ sqrt(5000000 / 3)c:0 ~ sqrt(5000000 / 2)d: 0 ~ sqrt(500000)已知N=a^2+b^2+c^2+d^2 B.先预处理出c^2+d^2=R的可行解,保存在哈希表里。java定义哈希:HashMap<Integer,Integer> f=new HashMap<Integer,Integer>();

key:c*c+d*d value:c

HashMap方法void                 clear()Object               clone()boolean              containsKey(Object key)boolean              containsValue(Object value)Set<Entry<K, V>>     entrySet()V                    get(Object key)boolean              isEmpty()Set<K>               keySet()V                    put(K key, V value)void                 putAll(Map<? extends K, ? extends V> map)V                    remove(Object key)int                  size()Collection<V>        values()

HashMap不支持Iterator所以要通过其他方式迭代Map中的Key和Value

C.枚举a,b根据a,b求得的 c^2+d^2的和查找哈希表 ,若找到即为所求总结:减少变量+Hash预处理+查找枚举时应用哈希:以空间换时间查找一个东西存不存在是我们经常遇到的一个基本问题哈希(hash):把将来需要查找的值预先保存起来,减少查找时间。

package 四平方和;

import java.util.HashMap;
import java.util.Scanner;

/**
 * 枚举方法+哈希优化
 * 对HashMap的应用
 * @author dell-
 *
 */
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n;
		@SuppressWarnings("resource")
		Scanner in=new Scanner(System.in);
		n=in.nextInt();
		HashMap<Integer,Integer> f=new HashMap<Integer,Integer>();
		for(int c=0;c*c*2<=n;c++){
			for(int d=c;d*d+c*c<=n;d++){
				if(!f.containsKey(c*c+d*d)){
					f.put(c*c+d*d, c);
				}
			}
		}
		for(int a=0;a*a*4<=n;a++){
			for(int b=a;(b*b+a*a)<=n/2;b++){
				if(f.containsKey(n-a*a-b*b)){
					int c=f.get(n-(a*a+b*b));
					int d=(int)(Math.sqrt(n-a*a-b*b-c*c)+1e-3);
					System.out.println(a+" "+b+" "+c+" "+d);
					break;
				}
			}
		}
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值