阶乘计算问题

Factorial Calculation Issue

我创建了一个 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 的图形 'desktop' 界面。 pc 的同一段代码 运行 不会产生任何问题。 如何修复我的应用程序以计算这些值而不是自行终止?

提前致谢。

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

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

试试这个:

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();

注意:-正如其他人在评论中指出的那样,这可能是因为该值太大,可能存在内存问题或要保存在 StringTextView

计算阶乘可以非常快速地得出非常大的数字。 100 的阶乘为 9.332621544 E+157。你的阶乘是 3.097722251 E+357506!虽然 BigInteger 理论上没有限制,但我还是建议你阅读 this question 中的答案。 此外,BigInteger 是一个不可变的 class,因此在每个循环中创建新的值确实会占用您的内存。您的代码似乎是正确的,但是当您处理阶乘时,大多数时候您会遇到内存问题。