Java 优化最坏时间线性复杂度代码

质数因子

http://www.nowcoder.com/questionTerminal/196534628ca6490ebce2e336b47b3607

此题,如果代码的最坏时间复杂度是线性的,只能通过大概 91% 的样例(我使用 java 的测试结果),原因之所在就是会有超大素数作为特殊样例来恶心人:

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    long num = scanner.nextLong();

    for (long i = 2; i <= num; ++i) {
        while (num % i == 0) {
            System.out.print(i + " ");
            num /= i;
        }
    }
    System.out.println();
}

但是正如我们判断数 num 是不是质数时,没必要从 2 一直尝试到 num 一样,此题中的大循环也大可不必写一个到 num 的循环,写到 即可,如果此时数字还没有除数,则可判定其本身是一个质数,没有再除下去的必要了,直接打印其本身即可:

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    long num = scanner.nextLong();
    long k = (long) Math.sqrt(num);

    for (long i = 2; i <= k; ++i) {
        while (num % i == 0) {
            System.out.print(i + " ");
            num /= i;
        }
    }
    System.out.println(num == 1 ? "": num+" ");
}
全部评论
这个的确是最好的
1
送花
回复
分享
发布于 2021-02-22 16:00
平方根方法竟然只能通过一组数据,是我电脑***了吗?
1
送花
回复
分享
发布于 2021-06-16 14:58
滴滴
校招火热招聘中
官网直投
在 num/=i;后面 做一个i--;就好了
1
送花
回复
分享
发布于 2021-07-24 16:41
这里用到了 一个定理:一个正整数只有一个质因子是大于其平方根的
20
送花
回复
分享
发布于 2021-02-28 11:54
2000000014 还有一个质因子 1000000007,平方根不行
8
送花
回复
分享
发布于 2021-12-01 17:16
好像不太严谨,题目求的不是因子,而是质数因子,第8行中num % i中的i不一定是质数吧- -
6
送花
回复
分享
发布于 2021-03-01 18:53
Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int c = (int)Math.sqrt(a); for(int i =2;i<=a;i++){ if(a%i==0){ System.out.print(i+" "); a = a/i; i--; }else{ if(i>=c){ System.out.print(a+""); break; } } } 根据楼主的平方思路,补充了完整答案(应该是)
6
送花
回复
分享
发布于 2022-03-31 19:30
这才是有用的解答。
5
送花
回复
分享
发布于 2021-01-17 22:27
这个优化的思路不太对,最大质因子是可以超过开方数的,最大质因子应该是long k <(num/2+1)
5
送花
回复
分享
发布于 2021-09-22 23:48
平方根都没必要: import java.util.*; import java.io.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n = scanner.nextInt(); for (int i = 2; i <= n;) { if (n % i == 0) { System.out.print(i + " "); n = n / i; } else { i++; } } } } }
5
送花
回复
分享
发布于 2021-11-04 17:25
我就没想到先求平方根,嗐,死活卡在91.67%
4
送花
回复
分享
发布于 2021-01-20 12:17
一个2000000014卡死,始终超时
4
送花
回复
分享
发布于 2021-10-28 16:09
其实这个没有从根本上解决问题,只是解决了内部测试数据,5432542544444213399像这种大long类型 还是会超时的;所以还是要找到更好的方式
3
送花
回复
分享
发布于 2021-03-05 11:48
++i是个啥意思 i++不行吗 求解
3
送花
回复
分享
发布于 2021-09-22 23:14
这个180结果是2233,缺少5。输入6只打印2
1
送花
回复
分享
发布于 2021-05-06 19:38
求了平方根也是91%?
点赞
送花
回复
分享
发布于 2021-03-08 13:35
这个平方根的去重了,题目没要求去重质因子,要保留。测试用例一样没通过~~~
点赞
送花
回复
分享
发布于 2021-07-10 21:44
开平方这个一般人想不到,绝了
点赞
送花
回复
分享
发布于 2022-01-06 02:14
虽然编完用例还是错的, 但是,作者算法优化在每次拿到输入数据时先判断本身是不是质数。如果自己就是质数,那么最后输入出自己就好了; 判断素数只需遍历到平方根处就好,所以总体上运行效率数字越高效率也体现的越明显
点赞
送花
回复
分享
发布于 2022-03-19 19:56
有问题,输入 35 就出bug了
点赞
送花
回复
分享
发布于 2022-03-24 12:33

相关推荐

投递恒生电子股份有限公司等公司7个岗位
点赞 评论 收藏
转发
474 91 评论
分享
牛客网
牛客企业服务