• 水仙花数优化问题:穷举法、查找表法、组合数学法


    package yxj.Test;


    import java.math.BigDecimal;
    import java.math.BigInteger;
    import java.util.Arrays;


    public class ShuiXianHua {
    static long searchTable[]=new long [10];
    static String s=null;


    /**
    * @param args
    */
    public static void main(String[] args) {
    int length_=8;
    long biStart_ = 10000000;
    long biEnd_ = 99999999;

    //穷举法
    //Jisuan1(biStart_,biEnd_,length_);

    //查找表法
    initSearchTable(length_);
    Jisuan2(biStart_,biEnd_,length_);

    //组合数学
    //int [] tint={1,6,3,4};
    //isSXHS(tint);
    smartRetrospectiveSearch(length_);
    }

    public static void smartRetrospectiveSearch(int n)
    {
    //组合数学
    long start=System.currentTimeMillis();
    System.out.println("组合数学:");
    int [] num= new int[n];
    int i=0;
    while(true)
    {
    if(i==n-1)
    {
    isSXHS(num);
    }
    else
    {
    i++;
    num[i]=num[i-1];
    continue;
    }
    while(i>=0&&num[i]==9)
    {
    i--;
    }
    if(i>=0)
    {
    num[i]++;
    }
    else
    {
    break;
    }
    }
    long end=System.currentTimeMillis();
    System.out.println("Time:"+(end-start)+"ms");
    }

    public static void isSXHS(int[] num)
    {
    BigInteger bit=BigInteger.valueOf(0);
    for(int a:num)
    {
    bit=bit.add(BigInteger.valueOf(searchTable[a]));
    }
    int[] tnum=new int [num.length];
    s=bit.toString();
    if(s.length()>num.length)
    {
    return;
    }
    for(int i=0;i<s.length();i++)
    {
    tnum[i]=s.charAt(i)-'0';
    }
    Arrays.sort(tnum);
    if(Arrays.equals(num, tnum)&&s.length()==num.length)
    {
    System.out.println(bit);
    }
    }

    public static void Jisuan1(long biStart_,long biEnd_,int length_)
    {
    System.out.println("穷举法:");
    long start=System.currentTimeMillis();
    long biStart = biStart_;
    long biEnd = biEnd_;
    int length=length_;
    outer:for(long bi=biStart;bi<=biEnd;bi++)
    {
    int biTest=0;
    s=bi+"";
    for(int i=0;i<length;i++)
    {
    biTest=biTest+(int)Math.pow((s.charAt(i)-'0'), length);
    if(biTest>bi)
    {
    continue outer;
    }
    }
    if(bi==biTest)
    {
    System.out.println(bi);
    }
    }
    long end=System.currentTimeMillis();
    System.out.println("Time:"+(end-start)+"ms");
    }


    public static void initSearchTable(int length)
    {
    for(int i=0;i<10;i++)
    {
    searchTable[i]=(long)Math.pow(i, length);
    }
    }

    public static void Jisuan2(long biStart_,long biEnd_,int length_)
    {
    System.out.println("查找表法:");
    long start=System.currentTimeMillis();
    long biStart = biStart_;
    long biEnd = biEnd_;
    int length=length_;
    outer:for(long bi=biStart;bi<=biEnd;bi++)
    {
    long biTest=0;
    s=bi+"";
    for(int i=0;i<length;i++)
    {
    biTest=biTest+searchTable[s.charAt(i)-'0'];
    if(biTest>bi)
    {
    continue outer;
    }
    }
    if(bi==biTest)
    {
    System.out.println(bi);
    }
    }
    long end=System.currentTimeMillis();
    System.out.println("Time:"+(end-start)+"ms");
    }


    }


    结果:

    查找表法:
    24678050
    24678051
    88593477
    Time:41078ms
    组合数学:
    24678050
    24678051
    88593477
    Time:62ms

  • 相关阅读:
    anaconda安装TensorFlow
    复习NLP-实战(三)
    复习NLP-实战(二)
    复习NLP-实战(一)
    python爬虫实战
    WebSocket实战(一)
    不上传图片直接本地预览
    oracle导出
    使用正则表达式验证学习成绩分数
    限制文本框,文本域输入的字符数量
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300969.html
Copyright © 2020-2023  润新知