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的代码:
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; } }
相关文章推荐
- 欧拉工程第20题 计算100!的各位之和
- Java 欧拉工程 第二十九篇【a的b次方(2≤a,b≤100)中共有多少个不同的数】
- Java 欧拉工程 第三十篇【 找出所有能够写成各位数字5次方之和的数之和】
- Java进阶之欧拉工程 第十六篇【2的1000次方各位之和为多少】
- Java进阶之欧拉工程 第十八篇【 找出从三角形顶端走到底端的最大和】
- Java 欧拉工程 第十九篇【 20世纪有多少个星期日是当月的第一天?】
- Java进阶之欧拉工程 第九篇【持续更新】
- Java进阶之欧拉工程 第十篇【持续更新】
- Java进阶之欧拉工程 第五篇【持续更新】
- Java 欧拉工程 第二十八篇【1001×1001的螺旋中两条对角线之和】
- Java进阶之欧拉工程 第十七篇【用英文写出1到1000的所有数字需要多少个字母?】
- Java进阶之欧拉工程 第二篇【持续更新】
- 算出100!的各位之和。
- Java 欧拉工程 第二十五篇【1000位斐波那契数】
- Java 欧拉工程 第二十六篇【 小于1000的数字中令1/d拥有最长循环圈的数字d】
- Java 欧拉工程 第二十一篇【计算10000以下所有相亲数之和】
- Java进阶之欧拉工程 第四篇【持续更新】
- Java进阶之欧拉工程 第三篇【持续更新】
- Java进阶之欧拉工程 第八篇【持续更新】
- Java进阶之欧拉工程 第十二篇【有大量约数的三角数】