使用Java-8获取最高有效的十进制数字

时间:2019-07-17 12:14:45

标签: java java-8

我试图获取整数的最高有效十进制数字,我的方法如下:

  
      
  1. 我正在尝试获取Integer(N)中的位数总数;

  2.   
  3. 我正在将Integer(N)除以1(.... count乘以0)。

  4.   

我已经完成了以下代码,并且工作正常,我只想使用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除以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 stream 类型的方法,都将有所帮助。

4 个答案:

答案 0 :(得分:2)

当您继续使用another collection的舍入值的方法时,还应该始终使用project_history进入另一个方向,而不是突然切换到log10操作。

Math.pow(10, …)

如前所述,在注释中,当您使用String操纵时,int maxi = (int)(N/Math.pow(10, Math.floor(Math.log10(N)))); 带来了完整的解决方案。或者,要获取String值:

Integer.toString(N).substring(0,1)

答案 1 :(得分:0)

根据我的说法,您解决方案的第一部分最简化,而且效率很高,而不是除以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);

答案 2 :(得分:0)

在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));
}

答案 3 :(得分:0)

一个简单的解决方案是反复除以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);