您的位置:首页 > 编程语言 > Java开发

Java 欧拉工程 第二十篇【 算出100!的各位之和。】

2014-08-20 22:32 363 查看
题目是这样:

n! = n x(n - 1) x... x3 x 2 x 1

例如, 10! = 10 x9 x ... x 3 x2 x 1 = 3628800,

那么10!的各位之和就是3 + 6 + 2 + 8 + 8 + 0 + 0 = 27.

算出100!的各位之和。

原题:

n! means n × (n − 1) × ... × 3 × 2 × 1

For example, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800,

and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27.

Find the sum of the digits in the number 100!

解题思路:

这道题一看就知道又回到了大数的计算上,由于求100!如果使用java中的*运算,那么计算过程中将出现int类型和long类型都无法承载(数据溢出)的问题,那么就应该想到将

大数的每一位拆开以数组的形式存储,在之前的十三篇和第十六篇中都出现过大数相加的计算,这里虽然是乘法,但是乘法的本质还是加法,比如100x99其实可以看作99个100的

和,所以解题的思路就是就每一步的乘法换成加法来运算,用数组存储结果,将最后得到的结果每一位相加得到这里的解 648,如下为java的代码:

public class Launcher {

public static void main(String[] args) {
// TODO Auto-generated method stub
int sum=0;
Vector<Integer> sumNum =new Vector<Integer>();
sumNum.add(1);
for(int i=2;i<101;i++){
sumNum=plus_big(sumNum,i);
}

for(int i=0;i<sumNum.size();i++){
sum+=sumNum.get(i);
}
System.out.println(sum);
}
/*输入的数组就是大数的数组形式,int类型b为大数相乘的数,返回的值为结果为数组形式的大数*/
public static Vector<Integer> plus_big(Vector<Integer> a ,int b){
Vector<Integer> intNum=new Vector<Integer>();
Vector<Integer> numLoop=new Vector<Integer>();
int c=0;
int count=0;//进位数,可能取值0和1
int localNum=0;//相同位数相加后去掉进1剩下的值
for( int i=0;i<a.size();i++){
numLoop.add(a.get(i));
}
for(int m=0;m<b-1;m++){
for(int i=0;i<a.size(); i++) {

c=numLoop.get(i)+a.get(i);          //相同位数相加
localNum=(c+count)%10;
count=c+count>9?1:0;               //检测是否进位

intNum.add(localNum);

if(i==a.size()-1&&numLoop.size()>a.size()){                                                                                                             //相加的两数位数不同,由于我这里由上而下加,位数多的一定在前面
for(int n=i+1;n<numLoop.size();n++){
c=numLoop.get(n);
localNum=(c+count) % 10;
intNum.add(localNum);
count=c+count>9?1:0;           //检测是否进位
}
}
}
if(count==1){                                                                                                   //如果位数相同,检测最高位最后的运算是否有进位,有进位再多生成一位数“1”
intNum.add(count);
count=0;
}

numLoop.removeAllElements();

for( int i=0;i<intNum.size();i++){
numLoop.add(intNum.get(i));
}

intNum.removeAllElements();
}
return numLoop;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: