欧拉工程第29题:Distinct powers

题目链接:https://projecteuler.net/problem=29

a^b for 2 ≤ a ≤ 100 and 2 ≤ b ≤ 100,能产生无重复的数据有多少个?
这个题目其实很简单的,注意一点定义成int、long都会发生越界的,Long只能存储:-2^64+1–2^64-1
所以不要用long,不然错的找不到原因。在java中Math类,可以计算指数,还是要注意这个返回的结果是double型,如果转成long,恭喜你错了。查看javaAPI中,double类型有如下截图:
欧拉工程第29题:Distinct powers_第1张图片
用double还是能存完的。
java中Set集合不包含相同元素。有HashSet、TreeSet都可以应用保证不会有重复的数据。

package projecteuler21to30;

import java.util.Date;
import java.util.TreeSet;

class level29{
    void solve(){
        int startA=2;
        int endA=100;
        int startB=2;
        int endB=100;
        int num=0;
        TreeSet set=new TreeSet();
        for(int i=startA;i<=endA;i++){
            for(int j=startB;j<=endB;++j){
// long powab=(long) Math.pow(i, j);//有2的100次方,发生越界的情况,所有这样不对。
                //long最长的是2的64次方-1.都是因为转成long惹的祸
                double powab= Math.pow(i, j);
                if(set.add(powab)){//set.add(Math.pow(i, j))
                    num++;
// System.out.print(powab+"、");
                }
            }
        }

        System.out.println(set.size()+","+num);
    }

}
public class Problem29 {
    public static void main(String[] args){
        Date beginTime=new Date();
        new level29().solve(); //9183
        Date endTime=new Date();
        long Time = endTime.getTime()-beginTime.getTime();
        System.out.println("Time:"+Time/1000+"秒"+Time%1000+"毫秒");
        }
}

你可能感兴趣的:(java,Math,欧拉工程)