【问题标题】:Counting Significant Figures java计算有效数字java
【发布时间】:2013-12-23 17:47:59
【问题描述】:

我正在尝试制作一个计算有效数字的程序,但我几乎完成了最后一件事,我完全陷入困境我无法弄清楚如何计算非零数字之间的零这是我的代码:

public class Main {

    public static void main(String[] args) {
        String  Integer = "10010000000";
        String Substring = null;
        String SubString2 = null;
        if(Integer.contains(".")){
            Substring = Integer.substring(0,Integer.indexOf("."));
            System.out.println(Substring);
            SubString2 = Integer.substring(Integer.indexOf(".")+1,Integer.length());
            System.out.println(SubString2);
        }
        char [] array = Integer.toCharArray();
        char [] array1 = null;
        if(Substring !=null)
            array1 = Substring.toCharArray();
        char [] array2 = null;
        if(SubString2!=null)
            array2 = SubString2.toCharArray();
        System.out.println(amountofSigFigs(array,array1,array2,Integer));
    }
    public static int amountofSigFigs(char [] a,char [] a1,char [] a2,String Integer){
        int count = 0;
        if(a1==null && a2 == null){
            for(int i = 0;i<a.length;i++){
                if(!(a[i]=='0')){
                    count++;
                }
            }
        }
        else{
            for(int i = 0;i<a1.length;i++){
                if(!(a[i]=='0')){
                    count++;
                }
            }
            for(int i = 0;i<a2.length;i++){
                count++;
            }
        }
        return count;
    }

}

【问题讨论】:

  • Integer 怎么会包含小数点?
  • 整数对于字符串变量来说是一个非常糟糕的主意。在 Java 中,用于命名以小写字母开头的变量。 Integer 是一个内置的类名。我什至不确定您的代码在没有警告的情况下编译

标签: java significant-digits


【解决方案1】:

您不应使用诸如“整数”之类的关键字作为变量标识符。

我有一些挥之不去的问题,但我会简单地对字符串使用 Java 的内置 split() 函数并使用 regex 将字符串拆分为有效数字(忽略结尾和前导零)。然后返回字符串长度的总和。这是纯整数的代码。

String myint = "000100101111220000020000";

String[] sig_figs = myint.split("(^0+|0+$)");

int sum = 0;

for(String fig : sig_figs)
{
    sum += fig.length();
}

return sum;

如果我们包含浮点数,则必须考虑其他规则,例如小数点后的零,除非它们前面都是零(3.00 有 3,0.03 有 1)。在这种情况下,遗憾的是,正则表达式变得更加做作,但我会使用 "(^0+(\\.?)0*|(~\\.)0+$|\\.)" 之类的东西来拆分。请参见下面的代码(注意——仍然适用于整数)

String myfloat = "0.0120";

String [] sig_figs = myfloat.split("(^0+(\\.?)0*|(~\\.)0+$|\\.)");

int sum = 0;

for (String fig : sig_figs)
{
    sum += fig.length();
}

return sum;

这里快速浏览一下正则表达式:

^0+(\\.?)0* 表示一个或多个前导零 (0+),后跟可选的小数 (\\.?),然后是零个或多个零 (0*)。

(~\\.)0+$ 表示我们想要去掉结尾的零 (0+$),但前提是它们前面没有小数点 ((~\\.))。

\\. 表示将小数点剩下的部分分开。

【讨论】:

  • @CB 抱歉,我这么晚才回复,但是它是如何像那样拆分字符串的
  • @user3097544 更新了解决更复杂正则表达式的答案。
  • 十进制正则表达式的一个问题是它不会从像“1000”这样的数字中删除零,即使这些零并不重要
【解决方案2】:

找到零后,开始单独计算零。每次找到零时,不断增加零计数器而不是主计数器。如果您找到一个非零数,请将零计数值添加到主计数器,并将零计数器设置为 0(重新启动它),并像正常的非零数一样增加主计数器。相反,如果您到达数字数组的末尾,则忽略零计数器。

因此,只有当零不是尾随零时,您才会最终将零计数器添加到主计数器,因此是 sigfigs。

【讨论】:

    【解决方案3】:

    下面的代码会找出字符串中0的个数

    String s = "1234320300340";
        int count = 0;
        for(int i = 0; i<s.length(); i++){
    
            if(s.charAt(i)== '0'){
                count++;
            }
        }
        System.out.println("total no of Zeros = "+ count);
    

    【讨论】:

    • 这不是他想要在这里完成的。
    • 好吧,他试图计算有效数字,事实证明,如果处理浮点数,这要复杂得多。在纯整数中,它的所有数字都不是前导零或结尾零
    猜你喜欢
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    相关资源
    最近更新 更多