我想实现RadixSort,并获得一个数字的某一特定小数点位的数字。
int num (int elem, int place)
--- if element == 12225 and place == 0
--- expected output would be 5 (starting to count by right)
--- if place == 4 expected output would be 1
我写了这个方法。但它既不能用,也没有效率。
static int key(int element, int decimalPlace) {
if (element < 0)
throw new IllegalArgumentException("invalid argument");
int tmp = (int) (Math.log10(element) + 1);
if (decimalPlace > tmp)
return 0;
else {
return Integer.parseInt(String.valueOf(Integer.toString(element).charAt(tmp - decimalPlace)));
}
}
我想我应该可以更有效地解决这个问题。
我会这样做。
return ( element / (int) Math.pow(10, decimalPlace) ) % 10
你可以用两种方法来解决这个问题:
从十进制字符串中挑选char(数字)表示你的正整数。
int getDigitAtPosition(Integer integer, int zeroBasedPositionFromRight) {
// raise error if pos < 0 or pos >= length or length == 0
decimalRepresentation = integer.toString();
int rightMostPosition = decimalRepresentation.length() - 1;
int indexOfDigit = rightMostPosition - zeroBasedPositionFromRight;
char digitChar = decimalRepresentation.charAt(indexOfDigit);
return Integer.parseInt(digitChar);
}
或者你可以用以下方法计算:(a)用高次幂-10的模数;然后(b)减去低次幂-10(包括其模数);最后(c)除以pos-power-10。
得到1234的正1位数=3。
变成(a)10^(1+1)=100er因数减去。
1200是减去,结果是34
则(b)10^(1-1)=1er减去
4被减去,结果是30
最后(c)整数除以10^(1)(忽略可能的余数)
30 10 = 3 所需数字的数值。
int getDigitAtPosition(Integer integer, int pos) {
// raise error if pos < 0 or pos >= length or length == 0
int higherUnit = 10^(pos +1) ; // a
int higherPart = (integer / higherUnit) * higherUnit;
int lowerUnit = 10^(pos -1); // b
int lowerPart = (integer / lowerUnit) * lowerUnit;
int posUnit = 10^(pos); // c
int digitAtPosition = (integer - higherPart - lowerPart) / posUnit;
return digitAtPosition;
}
看到 相关回答 利用 单元算术:
更一般地,一个数字的第n位可以通过公式获得。(数字基数^(n-1))%基数。
class FindDecimalPosition
{
public static void main (String[] args) throws java.lang.Exception
{
System.out.println(getNumber(1234567,0));
System.out.println(getNumber(1234567,1));
System.out.println(getNumber(1234567,2));
System.out.println(getNumber(1234567,3));
System.out.println(getNumber(1234567,4));
System.out.println(getNumber(1234567,5));
System.out.println(getNumber(1234567,6));
}
public static int getNumber(int num,int position){
char [] aux = (num+"").toCharArray();
if(position >= aux.length || position < 0 || num < 0) throw new IllegalArgumentException("invalid argument");
return Integer.valueOf((aux[aux.length - position-1]+""));
}
}