阶乘计算问题
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();
注意:-正如其他人在评论中指出的那样,这可能是因为该值太大,可能存在内存问题或要保存在 String
或 TextView
、
计算阶乘可以非常快速地得出非常大的数字。 100 的阶乘为 9.332621544 E+157。你的阶乘是 3.097722251 E+357506!虽然 BigInteger 理论上没有限制,但我还是建议你阅读 this question 中的答案。
此外,BigInteger 是一个不可变的 class,因此在每个循环中创建新的值确实会占用您的内存。您的代码似乎是正确的,但是当您处理阶乘时,大多数时候您会遇到内存问题。
我创建了一个 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();
注意:-正如其他人在评论中指出的那样,这可能是因为该值太大,可能存在内存问题或要保存在 String
或 TextView
、
计算阶乘可以非常快速地得出非常大的数字。 100 的阶乘为 9.332621544 E+157。你的阶乘是 3.097722251 E+357506!虽然 BigInteger 理论上没有限制,但我还是建议你阅读 this question 中的答案。 此外,BigInteger 是一个不可变的 class,因此在每个循环中创建新的值确实会占用您的内存。您的代码似乎是正确的,但是当您处理阶乘时,大多数时候您会遇到内存问题。