2013-02-26 113 views
-5

我已经写了一个程序来找出java中给定数字的数字位数。这是一个好的办法做到这一点,什么是程序的时间复杂度:数字的位数?

import java.util.*; 

public class Inst { 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

      Scanner sc = new Scanner(System.in); 
      double a = sc.nextDouble(); 
      for(int n=0;n<200000;n++) 
      { 
      double b=Math.pow(10, n); 

      double d=a/b; 
      if(d>=0 & d<=9) 
      { 
       System.out.println("The number has "+(n+1)+" DIGITS"); 
       break; 
      } 
      } 

    } 

} 
+4

不,这似乎不是一个很好的方式来做到这一点,有很多不必要的操作。扫描仪给你一个字符串,只是检查它是否是一个实际的数字,然后计算字符的数量 – 2013-02-26 01:57:41

回答

1
import java.util.*; 

public class JavaLength { 
    public static void main(String[] args){ 
    Scanner sc = new Scanner(System.in); 
    Double d = sc.nextDouble(); 
    String dString = d.toString(); 
    System.out.println(d); 
    if(dString.contains(".")){ 
     System.out.println("Total Characters: " + (dString.length() -1)); 
    }else{ 
     System.out.println("Total Characters: " + (dString.length())); 
    } /*-1 for the '.' in between, if it exists!*/ 
} 
1

这个怎么样?

double input = Input; 
int length = (input + "").length(); 
+0

雅谢谢,但我想制作一个程序,可以用任何语言实现。 – 2013-02-26 02:04:22

0

FWIW,测试表示整数所需(十进制)位数的最有效方法将是if/else测试的树。复杂性将是O(1),但代码将是UGLY(但便携);例如

int num = ... 

if (num >= 0) 
    if (num < 1000000) 
     if (num < 10000) 
      if (num < 100) 
       if (num < 10) 
        return 1 
       else 
        return 2 
      else 
       ... 
     else 
      ... 
    else 
     ... 
else 
    ... 
+0

这就像声称FFT是O(1)一样,因为任何实际的输入序列都是有限的。事实上,解决方案是O(log n)。我不确定它是否丑陋。 – 2013-02-26 07:06:54

+0

它是'O(log N)',其中'N'是'num'类型的最大可能值。对于任何原始类型,“N”将是一个常量。但是这种方法对于N不是常数的类型不适用,因为这意味着测试树的大小不是恒定的。 – 2013-02-27 06:11:01

+0

...因此,用N代替并调用'O(1)'是合理的。 (这是有道理的,因为如果'N'是'num'的值,那么所花费的时间不会变成'O(log N)'!)通过对比,FFT所花费的时间取决于输入数组,这是一个运行时参数。 – 2013-02-27 06:16:11

0

使用POW /日志通常不是一个很好的解决方案,因为有可能是接近的条数十个电力舍入到下一个整数。在双精度中,应该能够精确地存储所有15位数字,其中log10应该是绝对的< 15.实际上,log10(10^15-100)仍然舍入到15.

一个将被卡住相同的算法中,以十进制内部用于字符串的转换:

试除法

while (i > 0) { i=i/10; count++; } 

试验乘法

j=10; while (i >= j) { j*=10; count++; } 

将msb划分为lsb转换为字符串;

j=10000000; while (i>0) { 
       while (i>=j) { digit++;i-=j;}; 
       j/=10; *str++=digit+'0'; digit=0: 
      } 

二进制使用double dabble algorithm,其中每个数字由减少的十六进制数字集表示(省略-f)至BCD转换。