加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用单一方法获取功能Java流中的主要因素?

发布时间:2020-12-13 20:10:33 所属栏目:百科 来源:网络整理
导读:此方法将采用Long并返回传递给方法的任何数字的素数LongStream. factors.java public LongStream factors(long x){ LongStream factorStream = LongStream.range(1,x+1).filter(n - x%n == 0); return factorStream;} 利用上述方法首先找到共同因素是可以的.
此方法将采用Long并返回传递给方法的任何数字的素数LongStream.

factors.java

public LongStream factors(long x){
  LongStream factorStream = LongStream.range(1,x+1).filter(n -> x%n == 0);
  return factorStream;
}

利用上述方法首先找到共同因素是可以的.

primeFactors.java

public LongStream primeFactors(long x){
  LongStream primeFactorStream = factors(x).filter(n -> factors(n).count() == 0); 
  //doesn't work as factors.java returns a LongStream,which might include non-prime factors,which will not equate to zero.
  return primeFactorStream;
}

我理解这应该通过使用带谓词的简单isPrime()方法来轻松规避,但有没有办法为素数因子做同样的事情,但只有一个方法?

如果你想在没有现有的test-for-prime方法的帮助下用单一方法完成它,你可以这样做
public static LongStream primeFactors(long x) {
    return LongStream.rangeClosed(2,x)
                     .filter(n -> x % n == 0)
                     .filter(n -> LongStream.rangeClosed(2,n/2).noneMatch(i -> n%i==0));
}

你可以像这样测试方法

IntStream.concat(IntStream.rangeClosed(2,15),IntStream.rangeClosed(90,110))
         .forEach(number -> System.out.printf("%3d = %s%n",number,primeFactors(number)
                .mapToObj(d -> {
                    int p = 0;
                    for(long l = number; l%d == 0; l /= d,p++) l++;
                    return p == 1? String.valueOf(d): d + "^" + p;
                })
                .collect(Collectors.joining(" * ")))
         );
}
2 = 2
  3 = 3
  4 = 2^2
  5 = 5
  6 = 2 * 3
  7 = 7
  8 = 2^3
  9 = 3^2
 10 = 2 * 5
 11 = 11
 12 = 2^2 * 3
 13 = 13
 14 = 2 * 7
 15 = 3 * 5
 90 = 2 * 3^2 * 5
 91 = 7 * 13
 92 = 2^2 * 23
 93 = 3 * 31
 94 = 2 * 47
 95 = 5 * 19
 96 = 2^5 * 3
 97 = 97
 98 = 2 * 7^2
 99 = 3^2 * 11
100 = 2^2 * 5^2
101 = 101
102 = 2 * 3 * 17
103 = 103
104 = 2^3 * 13
105 = 3 * 5 * 7
106 = 2 * 53
107 = 107
108 = 2^2 * 3^3
109 = 109
110 = 2 * 5 * 11

不用说,这不是最有效的方法……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读