为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Java-8 获取最重要的十进制数字

使用 Java-8 获取最重要的十进制数字

aluckdog 2023-03-31 14:53:38
我正在尝试获取整数的最高有效十进制数字,我的方法如下:我正在尝试获取 Integer(N) 中的总位数(计数);我将 Integer(N) 除以 1(....count 乘以 0)。我已经完成了以下代码并且工作正常,我只是想在可能的情况下使用 java-8 来实现它。int N = 456778889;double expo = Math.log10(N);int expNum = (int)Math.floor(expo)+1;  //gets the total digits in the Integer N现在我有了数字 N 中的总位数,所以我可以将 N 除以 1,然后是零的总数,以实现这个 1,然后是 X 个零,我的逻辑如下:    StringBuilder sb = new StringBuilder("1");    sb.setLength(expNum);    String f = sb.toString().replaceAll("[^0-9]","0"); // It makes the 1 followed by X amount of zero that i require to get my MSB    int mostSigNum = N/(Integer.valueOf(f));    System.out.println(mostSigNum);我知道我的方法有点不同,因为我主要使用日志和其他数学函数,但我真的想以不同的方式来做。Java 8和流类型中的任何方法都可以提供帮助,我们将不胜感激。
查看完整描述

4 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

当您坚持使用 的舍入值的方法时log10,您还应该始终使用Math.pow(10, …)进入另一个方向,而不是突然切换到String操纵。

int maxi = (int)(N/Math.pow(10, Math.floor(Math.log10(N))));

如前所述,在评论中,当您使用String操作时,Integer.toString(N).substring(0,1)会导致一个完整的解决方案。或者,获取int值:

int maxi = Character.digit(String.valueOf(N).charAt(0), 10);


查看完整回答
反对 回复 2023-03-31
?
Helenr

TA贡献1780条经验 获得超3个赞

在 java8 中非常简单


public int maxi(int n) {

    return String.valueOf(n)

            .chars()

            .map(i -> i - '0')

            .max()

            .orElse(0);

}


@Test

public void testMaxi() {

    assertEquals(1, maxi(1000));

    assertEquals(7, maxi(7654));

    assertEquals(9, maxi(456778889));

}


查看完整回答
反对 回复 2023-03-31
?
跃然一笑

TA贡献1826条经验 获得超6个赞

根据我的说法,你的解决方案的第一部分是最简化的并且是有效的,而不是除以 10 并一直这样做直到我们没有余数。


int N = 456778889;

double expo = Math.log10(N);

int expNum = (int)Math.floor(expo);

现在考虑到每个流,我们可以执行以下操作来生成除法数,即 1 后跟 X 个零,使用时可以给我们 MSB(最高有效位):


    String c = IntStream.range(0,expNum).mapToObj(e->"0").collect(Collectors.joining(""));

    String t = "1".concat(c);

    int maxi = N/Integer.parseInt(t);

    System.out.println(maxi);


查看完整回答
反对 回复 2023-03-31
?
MM们

TA贡献1886条经验 获得超2个赞

一个简单的解决方案是重复除以 10,直到只剩下一个数字:


int number = 456778889;

int result = IntStream.iterate(number, i -> i / 10) // divide by 10

                      .filter(i -> i < 10)          // filter out if multiple digits

                      .findFirst().getAsInt();      // get the first value

这是不使用流的相同解决方案:


int number = 456778889;

int result;

for (result = number; result >= 10; result /= 10);


查看完整回答
反对 回复 2023-03-31
  • 4 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信