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
  • 相关阅读:
    Something I know about WebDynpro
    Details about support package implementation
    CRM Middleware Performance Topics
    Way to configure the logon navigaion layouts via Business Roles in CRM
    DOM 常用节点类型和方法
    第一届 xdef 会议日程
    去除百度音乐盒广告的chrome插件 持续更新
    从人人网抓取高校数据信息,包括,省份 高校 院系 (提供最终SQL文件下载)
    PHP 与 JSON
    解决HTTPS 发送请求走socket问题
  • 原文地址:https://www.cnblogs.com/xiaovw/p/7356222.html
Copyright © 2011-2022 走看看