【问题标题】:Factorial Calculation Issue阶乘计算问题
【发布时间】:2017-12-15 13:47:25
【问题描述】:

我创建了一个计算输入数字的阶乘的安卓应用。 我的代码是:

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

提前致谢。

【问题讨论】:

  • 首先我建议您找出应用程序被杀死/崩溃的原因。我不是 Android 开发人员,但我怀疑你在错误的地方计算它。由于计算 80000 的阶乘需要一段时间,我会在一些不会阻挡视图的后台进程中进行。
  • @Admit 你如何建议创建这个后台进程?
  • 一个线程多于一个进程
  • @Nick,我怀疑 Admit 建议您使用您的谷歌技能来了解 Android AsyncTasks 或线程。
  • @323go 说实话我是菜鸟,我不明白你告诉我的目的是什么。 Android AsyncTasks 呢?我应该解决什么问题?

标签: java android factorial calculation


【解决方案1】:

试试这个:

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

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

【讨论】:

  • 对不起,我是菜鸟。我必须在哪里粘贴你提到的那段代码?
  • @Nick 让它成为你的活动类的内部类
  • 感谢您的代码。它开始计算 80000 而不冻结屏幕,但我猜它崩溃了,因为它无法显示它。你能建议我如何解决它吗?
  • 我想我会让它为我保存值,而不是在它太大时显示。谢谢你。有什么方法可以知道对于我尝试它的设备的特定资源功能该值是否太大?
  • @Nick 我认为容量取决于您的设备可以分配多少内存,尽管 String 也限制了它可以容纳的字符数。你需要做一些逻辑来分块显示它,可能在多个页面中
【解决方案2】:

计算阶乘会很快得出非常大的数字。 100 的阶乘是 9.332621544 E+157。你的阶乘是 3.097722251 E+357506!虽然 BigInteger 理论上没有限制,但我建议你阅读this question 中的答案。 BigInteger 也是一个不可变的类,因此在每个循环中创建新的类对你的记忆来说真的很沉重。您的代码看起来是正确的,但是当您处理阶乘时,大多数时候您都会遇到内存问题。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-26
      • 2018-03-27
      • 2022-01-17
      • 1970-01-01
      • 2023-03-22
      • 2015-04-19
      • 1970-01-01
      • 2013-02-19
      • 2021-11-16
      相关资源
      最近更新 更多