zoukankan      html  css  js  c++  java
  • 蓝桥杯:排它平方数-java

    问题描述:  

      小明正看着 203879 这个数字发呆。原来,203879 * 203879 = 41566646641这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。具有这样特点的6位数还有一个,请你找出它!

    再归纳一下筛选要求:
        1. 6位正整数
        2. 每个数位上的数字不同
        3. 其平方数的每个数位不含原数字的任何组成数位

    第一种方法,用数学思想进行求解(两个集合并集的长度=集合1的长度+集合2的长度 => 两个集合的内容完全不同)
    import java.util.HashSet;
    import java.util.Set;
    
    public class Yi {
    	public static void main(String[] args) {
    		int t=0;
    		for (long i = 111111; i <= 999999; i++) {
    			if (i%10==1||i%10==5||i%10==6||i%10==0) {
    				continue;
    			}
    			if (fuhe(i,i*i)) {
    				t++;
    				System.out.println(i);
    			}
    		}
    		System.out.println(t);
    	}
    
    	private static boolean fuhe(long i, long l) {
    		Set set = new HashSet();
    		Set se = new HashSet();
    		
    		int a = geshu(set,i);
    		int b = geshu(se,l);
    		int c = geshu(set,l);
    		
    		if(a!=6){
    			return false;
    		}
    		a += b;
    		if (a==c) {
    			return true;
    		}
    		return false;
    	}
    
    	private static int geshu(Set set, long i) {
    		set.add(i%10);
    		while (i/10!=0) {
    			i/=10;
    			set.add(i%10);
    		}
    		return set.size();
    	}
    }
    

      注:第一种算法解释 203879*203879=41566646641 

         a=203879不同数字个数为6

         b=41566646641 不同数字个数为4

         c=在203879的基础上添加41566646641 的不重复数字的个数

         如果 c=a+b 则证明此数字复合要求

    第二种方法,用HashMap进行存储(用arrayList也可以,算法思想是一样的)
    import java.util.HashMap;
    public class 算法训练8月13号 {
    	
    	public void selectNum(){  
            for(long n = 100000; n <= 999999;n++){   
                if(isSelfRepeat(n))                    //有相同的数字,则跳过
                    continue;   
                else if(isPingFangRepeat(n*n,n)){    //该数的平方中是否有与该数相同的数字
                    continue;   
                }
                else{                                //符合条件,则打印
                       System.out.println(n); 
                }   
            } 
         }
    
        public boolean isSelfRepeat(long n){
            HashMap<Long,String> m=new HashMap<Long,String>();
            //存储的时候判断有无重复值
            while(n!=0){
                if(m.containsKey(n%10)){		//判断Map集合对象中是否包含指定的键名
                    return true;
                }
                else{
                    m.put(n%10,"1");
                }
                n=n/10;
            }
            return false;
        }
    
        public boolean isPingFangRepeat(long pingfang,long n){
            HashMap<Long,String> m=new HashMap<Long,String>();
            while(n!=0){
                m.put(n%10,"1");
                n=n/10;
            }
    
            while(pingfang!=0){
                if(m.containsKey(pingfang%10)){
                    return true;
                }
                pingfang=pingfang/10;
            }
            return false;
        }
    
        public static void main(String args[]){
            new 算法训练8月13号().selectNum();
        }
    }
    

      

    转载请注明出处:http://www.cnblogs.com/xiaovw/p/7356222.html   

    小V
  • 相关阅读:
    数据采集,微软控件分页问题的处理
    固定表头和列头
    字符串转时间类型
    js url加密解密
    Chosen—jquery选择框插件
    拉动滚动条加载数据
    webservse导出excel和word
    文本框与autocomplete结合使用
    jQuery的Select操作集合
    (转)常用算法大全-贪婪算法
  • 原文地址:https://www.cnblogs.com/xiaovw/p/7356222.html
Copyright © 2011-2022 走看看