大数阶乘的J2ME实现
|
|
Author: 一滴蔚蓝色 | Date: 2008-01-23 |
View: 942 |
开发技术 - 程序设计 | Digg:
0
|
|
大数阶乘,因为其最后结果通常为几十位甚至上百上千位,因为如果用普通的递归算法来做,肯定会出现溢出,在这里,我给出一段大数阶乘的算法代码,以供参考。 仓促写的,算法肯定不够好,现在算200的阶乘大概要3秒钟,大家可以参考一下,本文谢谢(大虾,Tommy,阿土,不是宝贝的帮助) import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class Check extends MIDlet { class test extends Canvas { public test() { } public void paint(Graphics g) { for(int i=0;i<400;i++) { if(i!=0) sum[i]=0; else sum[i]=1; sumTen[i]=0; sumG[i]=0; sumB[i]=0; } int j; for(j=1;j<=goal;j++) { // System.out.println(j); int a=j%10;// 得到个位 int b=j/10%10;// 得到十位 int c=j/100;// 得到百位 int length; for(length=399;length>=0;length--) { if(sum[length]!=0) break; } /* 对个位处理 */ for(int i=length;i>=0;i--) { sumG[i+1]+=sum[i]*a/10; sumG[i]=sum[i]*a%10; } for(int i=0;i<=length+1;i++) { sumG[i+1]+=sumG[i]/10; sumG[i]%=10; } /* 对十位处理 */ for(int i=length;i>=0;i--) { sumTen[i+2]+=sum[i]*b/10; sumTen[i+1]=sum[i]*b%10; } for(int i=0;i<=length+2;i++) { sumTen[i+1]+=sumTen[i]/10; sumTen[i]%=10; } /* 对百位进行处理 */ for(int i=length;i>=0;i--) { sumB[i+3]+=sum[i]*c/10; sumB[i+2]=sum[i]*c%10; } for(int i=0;i<=length+3;i++) { sumB[i+1]+=sumTen[i]/10; sumB[i]%=10; } /* 结果相加 */ for(int i=0;i<=length+3;i++) { sum[i]=sumG[i]+sumTen[i]+sumB[i]; } for(int i=0;i<=length+3;i++) { sum[i+1]+=sum[i]/10; sum[i]%=10; } } int i; g.setColor(0); g.fillRect(0,0,getWidth(),getHeight()); g.setColor(0xffffff); for(i=399;i>=0;i--) { if(sum[i]!=0) break; } // System.out.println("最后结果位数:"); System.out.println(i); for(int m=i;m>=0;m--) g.drawString(String.valueOf(sum[m]),getWidth()-13-m%17*10,getHeight()-30-m/17*15,0); } } private Display display; test t; int goal=100;// 阶乘数 int[] sum=new int[400]; int[] sumTen=new int[400]; int[] sumG=new int[400]; int[] sumB=new int[400]; public Check() { display=Display.getDisplay(this); } public void startApp() { t=new test(); display.setCurrent(t); } public void pauseApp(){ } public void destroyApp(boolean boo){ } } 载自:daojianxiao 更多阅读: |
尚无评论发表