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

题目是这样:

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;  
   }  
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值