我创建了一个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运行的同一段代码不会产生任何问题。 如何修复我的应用程序以计算这些值而不是自行终止?
提前感谢。
答案 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);
}
});