【发布时间】:2011-01-04 08:11:15
【问题描述】:
在 Java 中如何返回整数的第一个数字?
即
345
返回一个 3 的整数。
【问题讨论】:
-
如果没有字符串,您可以使用模运算提取它。
(345/10)%10 = 4,(345/100)%10 = 5
在 Java 中如何返回整数的第一个数字?
即
345
返回一个 3 的整数。
【问题讨论】:
(345/10)%10 = 4 , (345/100)%10 = 5
如果您只需要第一个数字/一个特定数字,那么它比任何解决方案都更容易:
int temp = 345%100 //temp = 45
int firstDigit = (345 -temp)/100 //fisrtDigit= 300/100 = 3
如果您还需要检查第二个数字,那么您需要重复第一步
int tempHuns = 345%100 //tempHuns = 45
tempTens = tempHuns %10 // tempTens= 5
int secondDigit = (tempHuns - tempTens)/10 //fisrtDigit= 40/10 = 4
【讨论】:
更新:log10 解决方案:
log10 解决方案的一种变体,没有除法。:
public int getFirstDigit(int x) {
double e = Math.log10(Math.abs((long) x));
return Double.valueOf(Math.pow(10.0, e - Math.floor(e))).intValue());
}
它在做什么?
while循环解决方案:
处理 Integer.MIN_VALUE 并将 Math.abs() 和强制转换保持在循环之外:
public static int getFirstDigit(int i) {
i = Math.abs(i / (Math.abs((long)i) >= 10 ) ? 10 : 1);
while (i >= 10 )
i /= 10;
return i;
}
【讨论】:
我觉得做起来更简单:
int firstDigit = i-(i/10)*10 // i is an integer or long value, positive or negative.
【讨论】:
为了从左到右分隔整数的数字,我使用了 2 种不同的方法,第一种方法是计算整数由多少位组成,然后通过将整数除以 10 将它们从左到右拆分为位数减1的幂。
//method to separate digits of an integer from left to right
private static void separateDigits(int num){
int numOfDigits = countNumberOfDigits(num);
for (int numOfZeros = numOfDigits-1; numOfZeros >= 0 ; --numOfZeros){
int divisor = (int) Math.pow(10, numOfZeros);
System.out.print( Math.abs(num) / divisor + " // " );
num %= divisor;
}
}
//method to count number of digits
private static int countNumberOfDigits(int num){
int numOfDigits=0;
//using absolute value of num allows method to work even with negative integers
while(Math.abs(num) > 0){
num = num / 10;
numOfDigits++; //this counts the number of times the "while" loops
}
return numOfDigits;
}
不使用数组或递归方法,只使用“/”和“%”进行简单除法。
调用方法:
public static void main(String args[]) {
separateDigits( -123456789 );
}
收益: 1 // 2 // 3 // 4 // 5 // 6 // 7 // 8 // 9 //
【讨论】:
public static void firstDigit(int number){
while(number != 0){
if (number < 10){
System.out.println("The first digit is " + number);
}
number = number/10;
}
}
当您调用它时,您可以使用 Maths.abs 以使其适用于负数:
firstDigit(Math.abs(9584578));
这会返回 9
【讨论】:
这是一个较小的版本,用于获取所有位置的数字,它适用于负值(不是小数)。
int number = -23456;
int length = (int) Math.log10(Math.abs(number)) + 1; //This gets the length of the number of digits used
//Math.abs to change negative int to positive
System.out.println("Digit at pos " + 1 + " is :- " + (int)(Math.abs(number)/Math.pow(10,(length-1))));
for (int i = 2; i <= length; i++){
System.out.println("Digit at pos " + i + " is :- " + (int)(Math.abs(number)/Math.pow(10,(length-i))%10));
}
【讨论】:
这种方式对我来说效果很好,但它确实涉及从 int 转换为 string 并返回到 int。
Integer.parseInt(String.valueOf(x).substring(0,1));
【讨论】:
Abs 调用:Integer.parseInt(String.valueOf(Math.abs(x)).substring(0,1));
假设数字是int类型
因此,
int number = 352
// Change the int into String format
String numberString = Integer.toString(number);
// We can know the first digit of that String with substring method directly
Integer.parseInt(numberString.substring(0,1));
或者另一种方式是将String改成char并从char中获取数值
例如
int number = 352;
String numberString = Integer.toString(number);
Character.getNumericValue(String.valueOf(target).charAt(0));
// 0 means the first digit of the number
【讨论】:
int firstNumber(int x){
int firstN = x;
while(firstN > 9){
firstN = (firstN - (firstN%10))/10;
}
return firstN;
}
【讨论】:
//Try this one.
Scanner input = new Scanner(System.in);
System.out.println("enter first 9 digits: ");
String x = input.nextLine();
String x1 = x.substring(0,1);
int d1 = Integer.parseInt(x1);
System.out.println(d1);
// the substring gives the position of extraction. method dont seem to work for letters though
【讨论】:
这是一个非常简单的分别获取整数的第一位和第二位数字的方法,但这仅适用于恰好两位数!
int firstDigit = number / 10;
int secondDigit = number % 10;
对于用户可能输入更多或更少数字但您可能不知道有多少的情况,您可以尝试这种方法,但其他答案对于这种情况有更好的解决方案。我刚刚编写了这个完整的程序,您可以将其粘贴到编译器中并运行。看到模式后,您可以检查任意数量的数字,然后捕获大于您想要接受的长度:
package testingdigits;
import java.util.Scanner;
public class TestingDigits {
Scanner keyboard = new Scanner(System.in);
public static void main(String[] args)
{
Scanner keyboard = new Scanner(System.in);
System.out.printf("\nEnter a number to test:");
int number = keyboard.nextInt();
int length = (int) Math.log10(number) + 1; //This gets the length of the number of digits used
//Initializing variables first to prevent error
int firstDigit = 0, secondDigit = 0, thirdDigit = 0, fourthDigit = 0, fifthDigit = 0, sixthDigit = 0;
if (length == 1)
{
firstDigit = number;
System.out.println("" + firstDigit);
}
if (length == 2)
{
firstDigit = number / 10; //For example, 89/10 will output 8.9 and show as 8 in this case.
secondDigit = number % 10;
System.out.println("" + firstDigit + "" + secondDigit);
}
if (length == 3)
{
firstDigit = number / 10 / 10; // 123/10/10 is 1.23 and will show as 1
secondDigit = number / 10 % 10;
thirdDigit = number % 10;
System.out.println("" + firstDigit + "" + secondDigit + "" + thirdDigit);
}
if (length == 4)
{
firstDigit = number / 10 / 10 / 10;
secondDigit = number / 10 / 10 % 10;
thirdDigit = number / 10 % 10;
fourthDigit = number % 10;
System.out.println("" + firstDigit + "" + secondDigit + "" + thirdDigit + "" + fourthDigit);
}
if (length == 5)
{
firstDigit = number / 10 / 10 / 10 / 10;
secondDigit = number / 10 / 10 / 10 % 10;
thirdDigit = number / 10 / 10 % 10;
fourthDigit = number / 10 % 10;
fifthDigit = number % 10;
System.out.println("" + firstDigit + "" + secondDigit + "" + thirdDigit + "" + fourthDigit + "" + fifthDigit);
}
//You can probably see the pattern by now. It's not an elegant solution, but is very readable by even beginners:
if ((length == 6))
{
firstDigit = number / 10 / 10 / 10 / 10 / 10; //The first digit is divided by 10 for however many digits are after it
secondDigit = number / 10 / 10 / 10 % 10;
thirdDigit = number / 10 / 10 / 10 % 10;
fourthDigit = number / 10 / 10 % 10;
fifthDigit = number / 10 % 10; //The second to last always looks like this
sixthDigit = number % 10; //The last digit always looks like this no matter how big you go
System.out.println("" + firstDigit + "" + secondDigit + "" + thirdDigit + "" + fourthDigit + "" + fifthDigit + "" + sixthDigit);
}
if ((length > 6))
{
//The main problem with this approach is that you have to define in advance how many digits you are working with
//So it's simple, but not very elegant, and requires something to catch unexpected input from the user.
System.out.println("Invalid Input!");
}
}
}
作为一个程序,它只输出您输入的数字,但正如您所看到的,它的执行方式表明它能够分隔用户输入的数字,因此您可以将其用作简单的测试程序,但同样,它不如这里的其他一些解决方案,它只是一种适合初学者的可读方法。它也可以接受否定。
另外:如果您以 double 开头,您可以使用以下命令转换为 int 并截断小数:
numberInt = (int)number;
【讨论】:
我认为这可能是一个不错的方法:
public static int length(int number) {
return (int)Math.log10(Math.abs(number)) + 1;
}
public static int digit(int number, int digit) {
for (int i = 0; i < digit; i++) {
number /= 10;
}
return Math.abs(number % 10);
}
适用于负数和正数。 digit(345, length(345) - 1) 将返回 3,digit(345, 0) 将返回 5 例如等等……
【讨论】:
我觉得这个更简单:
int firstDigit(int num)
{
if(num/10 == 0)
return num;
return firstDigit(num/10);
}
【讨论】:
查看提供的代码似乎有点过于复杂了,这里有一个简单的解决方案...
int number = 4085;
int firstDigit = number;
while (firstDigit > 9)
{
firstDigit = firstDigit / 10;
}
System.out.println("The First Digit is " + firstDigit);
【讨论】:
int a = 354;
int b = (int)(a / Math.Pow(10, (int)Math.Log10(a))); // 3
【讨论】:
另一种方式:
public int firstDigit(int x) {
if (x == 0) return 0;
x = Math.abs(x);
return (int) Math.floor(x / Math.pow(10, Math.floor(Math.log10(x))));
}
【讨论】:
忽略负值会导致:
(""+345).charAt(0);
【讨论】:
最简单的方法是使用String.valueOf(Math.abs((long)x)).charAt(0) - 这会给你一个char1。要将其作为整数值,您只需减去“0”(在 Unicode 中,“0”到“9”是连续的)。
当然,这有点浪费。另一种方法是取绝对值,然后循环除以 10,直到数字在 0-9 范围内。如果这是家庭作业,这就是我要给出的答案。但是,我不会提供它的代码,因为我认为它可能是家庭作业。但是,如果您提供 cmets 并编辑您的答案以说明您的工作方式和遇到的问题,我们或许可以提供帮助。
1需要注意的一点是Integer.MIN_VALUE 的绝对值不能表示为int - 所以您可能应该先转换为long,然后使用Math.abs,然后做算术。这就是为什么那里有演员表。
【讨论】:
long)和三个方法调用(valueOf、abs、charAt)。第二种形式的循环建议仍然需要强制转换(或隐式转换)和abs 来处理Integer.MIN_VALUE。我也不同意它是拜占庭式的——这对我来说似乎很自然。当您从格式化的意义上考虑整数时,它实际上只有一个“第一个数字” - 所以将它转换为字符串并获取第一个字符非常明显,不是吗?其他复杂性只是由于处理负数。
public static int firstDigit(int n) {
while (n < -9 || 9 < n) n /= 10;
return Math.abs(n);
}
也应该很好地处理负数。在这种情况下将返回一个负数。
【讨论】:
-)?我不愿意为此担心太多。
作业提示:将其转换为字符串并返回第一个字符。
【讨论】:
这是 Groovy,但它应该很容易转换为 Java:
int firstNum(int x) {
a = Math.abs(x)
sig = Math.floor(Math.log10(a))
return a / Math.pow(10, sig)
}
结果:
groovy> println(firstNum(345))
3groovy> println(firstNum(3452))
3groovy> println(firstNum(-112))
1groovy> println(firstNum(9999))
9groovy> println(firstNum(Integer.MAX_VALUE))
2groovy> println(firstNum(Integer.MIN_VALUE + 1))
2
【讨论】:
缺少的递归解决方案:
int getFirstInt(int input) {
if (input > 0 ? input < 10 : input > -10) {
return input > 0 ? input : -input;
}
return getFirstInt(input / 10);
}
我不会在现实生活中使用三元运算符,但是 - 它不是很漂亮吗? ;)
【讨论】:
if 条件,但我可能会将它用于返回语句 - 至少在 Math.abs 不存在的情况下。
最快的方法是:
【讨论】:
int main(void) {
int num = 3421;
while (num*num + 10 - num*(1 + num) <= 0) {
num *= (num - 0.9*num)/num;
}
std::cout << num << std::endl;
}
【讨论】: