析因计算问题

时间:2017-12-15 13:47:25

标签: java android factorial calculation

我创建了一个Android应用程序来计算输入数字的阶乘。 我的代码是:

void factorial(int x){
    if(x>=0){
        BigInteger res= new BigInteger("1");
        for(int i=x; i>1; i--){
            res = res.multiply(BigInteger.valueOf(i));
        }

        TextView text = (TextView)findViewById(R.id.resultTextView);
        text.setText(res.toString());
    }
}

它可以工作,但是当我尝试计算因子80.000以及更多的应用程序卡住片刻然后退出,重新加载android的图形“桌面”界面。 由pc运行的同一段代码不会产生任何问题。 如何修复我的应用程序以计算这些值而不是自行终止?

提前感谢。

3 个答案:

答案 0 :(得分:2)

试试这个:

private class FactCalculator extends AsyncTask<Void, Void, BigInteger> {
    int number = 0;

    public FactCalculator(int i) {
        this.number =i;
    }

    @Override
    protected BigInteger doInBackground(final Void... params){
        try{
            if(number>=0) {
                BigInteger res = new BigInteger("1");
                for (int i = number; i > 1; i--) {
                    res = res.multiply(BigInteger.valueOf(i));
                }
                return res;
            }
         } catch(Exception e){
             e.printStackTrace();
         }
         return null;
     }

     @Override
     protected void onPostExecute(final BigInteger result) {
         if (result != null) {
             TextView text = (TextView)findViewById(R.id.resultTextView);
             text.setText(result.toString());
         }
     }
 }

称之为:

new FactCalculator(80000).execute();

注意: - 正如其他人在评论中指出的那样,可能是因为价值过大,可能会出现内存问题或者存在于String或{ {1}},

答案 1 :(得分:1)

计算阶乘可以非常快地导致非常大的数字。因子100是9.332621544 E + 157。你的阶乘是3.097722251 E + 357506!虽然BigInteger理论上没有限制,但我建议你阅读this question中的答案。 BigInteger也是一个不可变的类,所以在每个循环中创建新的类都非常重要。你的代码似乎是正确的,但是当你处理因子时,大多数情况下都会遇到内存问题。

答案 2 :(得分:0)

你可以把你的方法放在处理程序

    Handler handler=new Handler(); 
    handler.post(new Runnable(){ 
    @Override
    public void run() {
        if(x>=0){
          ................
        }
        handler.postDelayed(this,500);
    }
});