我试图获取整数的最高有效十进制数字,我的方法如下:
我正在尝试获取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除以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 类型的方法,都将有所帮助。
答案 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);