但是有BUG,int num = 0; ==> sum = 0; int num = -1111; int sum = 0; do { num /= 10; sum++; } while (num != 0); System.out.println(sum);
我也来一个 int num = 980283828; int test =32 - Integer.numberOfLeadingZeros(num); int j; for(j = 0;j < 10; j++){ if(test < 3 * (j + 1)+1 ) if(num<(int)Math.pow(10,j)){ System.out.println(j );break; }else{ System.out.println(j+1);break; } } System.out.println("over");
不用除法的话,由于绝对值最大的Integer.MIN_VALUE = - 2^32 = 2147483647共10位,可以用数组 private static int[] TENS = new int[] { 0, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; static int len(int x) { if (x == Integer.MIN_VALUE) { // Integer.MIN_VALUE 由于补码的限制,这个32bit数的绝对值等于自己,所以特殊处理 return 10; } x = x < 0 ? -x : x; for (int i = 1; i < TENS.length - 1; i++) { if (x < TENS[i]) { return i; } } return TENS.length; }
更正Integer.MIN_VALUE = - 2^32 = -2147483648
谢谢楼上各位兄弟的支持,我觉的下面这代码效率比用除法高,跟大家学习下。public class Test { final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, Integer.MAX_VALUE }; static int stringSize(int x) { for (int i=0; ; i++) if (x <= sizeTable[i]) return i+1; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.print(stringSize(2)); } }
但是这样占用了额外的空间。而且算法复杂与除法是一致的,平均需要 5 次循环。对于现代 CPU 来说,有原生的除法指令,而且在 JVM 中 int 是经过特别优化过的。对于数组的索引查找与除法,还是除法更快。索引查找的话,需要根据索引点以及数据空间占用计算出数组元素的内存偏移值,再加上这个数组的首地址才能定位。
int sum =0;
while(num!=0){
num /= 10;
sum++;
}
System.out.println(sum);
String s = num+"";
System.out.println(s.length());
int num = -256234234;
String s = num <0?num*-1+"":num+"";
System.out.println(s.length());
string 严重影响效率
public class IntLenght { public static void main(String[] args) {
System.out.println(Integer.SIZE);
}
}输出:
32不知道这样是不是可以?
呵呵 api 自带的一般都不错顶一个
这个不一定,我用junit测试了一下 转string效率不差的但上面有用replace的效率就低了!
int num = -1111;
int sum = 0;
do {
num /= 10;
sum++;
} while (num != 0);
System.out.println(sum);
int num = 980283828;
int test =32 - Integer.numberOfLeadingZeros(num);
int j;
for(j = 0;j < 10; j++){
if(test < 3 * (j + 1)+1 )
if(num<(int)Math.pow(10,j)){
System.out.println(j );break;
}else{
System.out.println(j+1);break;
}
}
System.out.println("over");
0, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000
}; static int len(int x) {
if (x == Integer.MIN_VALUE) {
// Integer.MIN_VALUE 由于补码的限制,这个32bit数的绝对值等于自己,所以特殊处理
return 10;
}
x = x < 0 ? -x : x;
for (int i = 1; i < TENS.length - 1; i++) {
if (x < TENS[i]) {
return i;
}
}
return TENS.length;
}
final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
99999999, 999999999, Integer.MAX_VALUE };
static int stringSize(int x) {
for (int i=0; ; i++)
if (x <= sizeTable[i])
return i+1;
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.print(stringSize(2));
}
}
但是这样占用了额外的空间。而且算法复杂与除法是一致的,平均需要 5 次循环。对于现代 CPU 来说,有原生的除法指令,而且在 JVM 中 int 是经过特别优化过的。对于数组的索引查找与除法,还是除法更快。索引查找的话,需要根据索引点以及数据空间占用计算出数组元素的内存偏移值,再加上这个数组的首地址才能定位。
This method is great.Who invent it?
//该整数的位数为
System.out.println("位数 = " + intStr.length());