检索数字的第一位[重复]

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;

【讨论】:

以上是关于检索数字的第一位[重复]的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式:匹配单个数字重复n次

如何比较数字子列表中的第一项,如果重复,比较第二项并选择第二项最小的子列表?

如何根据两个标准之一检索排名靠前的项目[重复]

算法初步:二分查找

SQL检索,但检索结果中有某字段内容重复的数据只保留1条显示

LeetCode 1012 至少有 1 位重复的数字