文章

2

粉丝

136

获赞

1

访问

9.5k

头像
用java的带火别用Math的cbrt 包含大量重复计算
推荐阅读

import java.util.Scanner;

public class SpecialNum {
    /*
        设一个正整数既是平方数又是立方数时,称之为Special数。
        输入包含多组测试用例,
        第一行输入测试数据的组数,
        接着在后续每行输入n的时候,
        请输出"1到n中"包含的所有Special数的个数。
        n<= 1000000000
    */
    //注1: 别摁循环 时间复杂度太高
    //注2: 开根算太慢了 用乘方逆运算
    //判断是否Special:用double存数据 开根之后减(int)看他是否为0
    //核心: 用数组记录1-1000000000中所有special数
    public static int IsSqrt(double j){
        if (Math.sqrt(j) - (int) Math.sqrt(j) == 0)
            return 1;
        return 0;
    }

    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        //先判断哪些是special数
        int[] special = new int[31];  //可以预判
        int sp = 0;
        //这里存在大量数的开根 会有不必要运算 比如10000开根和9999开根其实有大量重复计算
//        for (int i=1; i<=1000000000; i++)
//            if(IsSpecial(i)==1)
//                special[sp++] = i;
        //用乘方法只用一次从1-1000000000的遍历 甚至都没有这么多次
        for (int i=1; i*i*i<=1000000000; i++)
    ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发