检索数字的第一位[重复]
Posted
技术标签:
【中文标题】检索数字的第一位[重复]【英文标题】:Retrieving the first digit of a number [duplicate] 【发布时间】:2011-02-27 09:58:08 【问题描述】:我刚刚学习 Java 并试图让我的程序检索数字的第一位 - 例如 543 应该返回 5 等。我想转换为字符串,但我不确定如何转换回来了?感谢您的帮助。
int number = 534;
String numberString = Integer.toString(number);
char firstLetterChar = numberString.charAt(0);
int firstDigit = ????
【问题讨论】:
你想对负数做什么? 在我的情况下,这个数字不应该是负数,所以我不在乎 负数乘以-1,然后照常进行。 @Ben Burnett:改用 Abs 【参考方案1】:几乎肯定比使用字符串更有效:
int firstDigit(int x)
while (x > 9)
x /= 10;
return x;
(仅适用于非负整数。)
【讨论】:
为什么不将 x 转换为绝对值:x = x @Ahmet Integer.MIN_VALUE 除外。【参考方案2】: int number = 534;
int firstDigit = Integer.parseInt(Integer.toString(number).substring(0, 1));
【讨论】:
这确实是 so 比其他地方(例如 ***.com/questions/2051817/…)中所有深奥/过于复杂和算法的答案更简单/可用——也许这不会扩展在具有 20 位数字的大型机科学应用程序中......但是谁在写这些呢???【参考方案3】:firstDigit = number/((int)(pow(10,(int)log(number))));
这应该使用数学而不是字符串来获取您的第一个数字。
在您的示例 log(543) = 2.73 中,转换为 int 为 2。 pow(10, 2) = 100 543/100 = 5.43,但由于它是一个 int,它会被截断为 5
【讨论】:
看看它如何针对字符串操作进行基准测试会很有趣 看起来很有趣,但这样做有什么好处吗?如果我正在阅读那行并且我不是数学教授,我将不知道它的作用:-) 嗯,100 的对数是 2,999 的对数是 2.99,所以如果存储为 int,您可以看到日志返回的位数减一。位数告诉您将数字除以什么。然后我们使用 int 的内置功能截断小数点后的所有内容,留下第一个数字。我不能告诉你哪种方式更快。我只是想提供一个不需要将数字转换为字符串的替代解决方案。 Math.pow 对于整数来说效率太低了;你应该在那里自己动手。 在数学库中应该是 log10,因为 log 是 log base 2。除数 = (int)(Math.pow(10,(int) Math.log10(rem))); leftdigit = (int) (rem * 1.0 / 除数);【参考方案4】:int number = 534;
String numberString = "" + number;
char firstLetterchar = numberString.charAt(0);
int firstDigit = Integer.parseInt("" + firstLetterChar);
【讨论】:
你喜欢用 numberString = "" + number 代替 numberString = Integer.toString(number) 有什么原因吗? 他只是懒得打字了 :) @Dimitris True。 :) 但是 "" + int = String 是一个 Java 习惯用法 而 ""+int 是一个非常笨拙的成语。它创建一个 StringBuilder,向其附加一个空字符串,将 int 转换为字符串,将此字符串附加到 StringBuilder,然后将 StringBuilder 转换为 String。直接说 Integer.toString(n) 或 String.valueOf(n) 效率更高。【参考方案5】:Integer.parseInt
将接受一个字符串并返回一个 int。
【讨论】:
【参考方案6】:int firstDigit = Integer.parseInt(Character.toString(firstLetterChar));
【讨论】:
【参考方案7】:此示例适用于任何双精度数,而不仅仅是正整数,并且考虑了负数或小于一的数。例如,0.000053 将返回 5。
private static int getMostSignificantDigit(double value)
value = Math.abs(value);
if (value == 0) return 0;
while (value < 1) value *= 10;
char firstChar = String.valueOf(value).charAt(0);
return Integer.parseInt(firstChar + "");
为了获得第一个数字,这坚持使用字符串操作,因为它更容易阅读。
【讨论】:
【参考方案8】:int number = 534;
int firstDigit = number/100;
( / ) java 中的运算符将数字相除而不考虑提醒,因此当我们将 534 除以 100 时,它会得到 (5) 。
但是如果你想得到最后一个数字,你可以使用 (%) 运算符
int lastDigit = number%10;
这提醒了我们除法,所以 534%10 将产生数字 4。
【讨论】:
@Maysera,添加纯代码答案通常被认为是质量差的帖子。它告诉其他人什么,但不是为什么这个 sn-p 解决了这个问题。请更新您的答案。 @MaherAbuthraa 我刚刚做了 添加硬编码 100 无法达到目的,543 只是一个示例。所以,这行不通。这就像硬编码返回 5。 @srikanthNutigattu 不,这不是“硬编码”。这适用于所有 3 位数的数字。 return 5 不适用于 666 :D @MaysaraAlhindi 不知道为什么我之前的评论被标记为“硬编码”,为什么假设它是一个 3 位数字? OP 没有表达的地方。【参考方案9】:如果您不想使用 str 方法,这种方式可能更有意义
int first = 1;
for (int i = 10; i < number; i *= 10)
first = number / i;
【讨论】:
以上是关于检索数字的第一位[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何比较数字子列表中的第一项,如果重复,比较第二项并选择第二项最小的子列表?