zoukankan      html  css  js  c++  java
  • 欧拉工程第52题:Permuted multiples

    题目链接

    题目:

    125874和它的二倍,251748, 包含着同样的数字,只是顺序不同。

    找出最小的正整数x,使得 2x, 3x, 4x, 5x, 和6x都包含同样的数字。

    这个题目相对比较简单

    暴力遍历

    判断x,2x,3x,4x,5x,6x是否包含的数字相同

    如何判断两个数包含的数字相同?

    1.

    两个数字转换成字符串后:d1,d2

    定义两个集合ts1,ts2,

    将d1,d2的各位数都添加到集合ts1中

    将d1的各位数添加到集合ts2中

    最后这个两个集合相等,则,这个两个数包含相同的数字

    2.

    public  boolean permutation(int a, int b)
            {
                int[] nums = new int[10];
                int temp1 = a;
                int temp2 = b;
                while(temp1>0 && temp2>0)
                {
                    nums[temp1%10]++;
                    nums[temp2%10]--;
                    temp1/=10;
                    temp2/=10;
                }
                for(int c = 0;c<10;c++)
                {
                    if(nums[c] != 0)
                        return false;
                }
                return true;
            }

    看程序吧,描述不好了。。。

    java程序:

    package projecteuler51to60;
    
    import java.util.Set;
    import java.util.TreeSet;
    
    class level52{    
        void solve0(){
            int Max_Value=1000000;
    
    
            for(int i=2;i<Max_Value;++i){
                if(sameDigit(i,2*i)  &&sameDigit(i,3*i) &&
                        sameDigit(i,4*i) &&sameDigit(i,5*i) &&
                        sameDigit(i,6*i)){
                    System.out.println(i);
                    return;
                }
            }
        
        }
        void solve1(){
            int orig=1;
            int ans=0;
            while(ans==0){
                int count=1;
                for(int a=2;a<=6;a++){
                    int b=orig*a;
                    if(permutation(orig,b))
                        count++;
                }
                if(count==6)
                    ans=orig;
                orig++;
            }
             System.out.println(ans);    
        }
          public  boolean permutation(int a, int b)
            {
                int[] nums = new int[10];
                int temp1 = a;
                int temp2 = b;
                while(temp1>0 && temp2>0)
                {
                    nums[temp1%10]++;
                    nums[temp2%10]--;
                    temp1/=10;
                    temp2/=10;
                }
                for(int c = 0;c<10;c++)
                {
                    if(nums[c] != 0)
                        return false;
                }
                return true;
            }
    
        boolean sameDigit(int a,int b){
            String stra=String.valueOf(a);
            String strb=String.valueOf(b);
            Set<String> set=new TreeSet<String>();
            Set<String> setEqual=new TreeSet<String>();
            if(stra.length()!=strb.length()) return false;
            for(int i=0;i<stra.length();i++){
                set.add(stra.substring(i,i+1));
                set.add(strb.substring(i,i+1));
                setEqual.add(strb.substring(i,i+1));
    
            }
            return set.equals(setEqual);
        }
        
    
        
    }
    public class Problem52 {
    
    
        public static void main(String[] args){
            long begin= System.currentTimeMillis();
            new level52().solve0();
            long end = System.currentTimeMillis();
            long Time = end - begin;
            System.out.println("Time:"+Time/1000+"s"+Time%1000+"ms");
        }
    
    }
  • 相关阅读:
    BT656与BT1120的区别
    Arria10中PHY的时钟线结构
    Arria10中的IOPLL与fPLL
    Nios内部RAM固化配置
    实现1sym转换成2个sym送给CVI(VGA数据)
    embeded_2_separate_sync
    动态规划--青蛙跳
    动态规划 0--1 背包问题
    模拟题
    动态规划--最大子段和
  • 原文地址:https://www.cnblogs.com/theskulls/p/4671967.html
Copyright © 2011-2022 走看看