-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

5 回答 5

1

这个怎么样?

double input = Input;
int length = (input + "").length();
于 2013-02-26T01:59:28.370 回答
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!*/
}
于 2013-02-26T01:58:11.437 回答
0

使用 pow / log 通常不是一个好的解决方案,因为可能有一个接近 10 次方的数字会四舍五入到下一个整数。在双精度中,应该能够精确存储 log10 绝对小于 15 的所有 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 算法进行二进制到 bcd 转换,其中每个数字由一组减少的十六进制数字表示(省略 af)。

于 2013-02-26T07:31:30.007 回答
0

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

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 
    ...
于 2013-02-26T03:09:11.773 回答
0

这个逻辑最初是用 C++ 编写的,但我相信这是查找位数、以相反顺序存储并找到位数总和的最佳方法。

int n;
int count=0, sum=0;
int j=0;
int ar[10];    //array to store digits

cin>> n;      //input number
do{
    if((n/10)==0){
        count++;
        ar[j]=n;
        break;
    }
    
    else{
        count++;
        ar[j]= (n%10);
        j++;
        n=int(n/10);
    }
}

`
while((n/10)!=0||(n%10)!=0);

cout<<"The number of digits is: "<<count<<"\n"<<"The reverse number is: ";

for(int u=0;u<count;u++){
    cout<<ar[u];
    sum+=ar[u];
}
cout<<"\n"<< "Sum of digits is: "<< sum;
}`
于 2020-08-09T19:15:08.753 回答