`
to_zoe_yang
  • 浏览: 143320 次
  • 性别: Icon_minigender_2
  • 来自: 01
社区版块
存档分类
最新评论

Problem 20

阅读更多
问题描述:
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!


Java中可以使用BigDecimal
不过也可以使用自己实现的大数算法~

结果:
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  4  6  8  6  1  9  0  1  2  5  8  1  1  5  2  8  5  7  3  2  2  7  2  8  0  2  9  7  9  6  3  5  2  6  8  2  8  1  5  6  5  1  6  7  9  3  6  4  1  4  9  8  0  6  5  1  9  9  2  2  3  9  9  9  9  5  7  1  2  5  9  8  3  6  9  2  9  5  8  6  4  1  2  6  1  8  3  4  6  2  8  6  9  5  1  7  0  9  4  0  0  7  6  6  2  6  5  8  8  3  2  9  9  6  1  8  6  2  5  1  4  4  9  3  4  4  5  1  2  6  2  3  3  9  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
648
16
最后的16是执行的时间毫秒级别
因为每次都会产生无用的0,而且越来越多,导致进行无效的计算很多次
算法还可以改进~

具体的算法
public static Byte[] StringToByte(String number){
		int len = number.length();
		Byte[] result = new Byte[len];
		//从高位到低位依次转换,转换后字符串"1234"变为4321,这样方便以后计算
		for(int i=0; i<number.length(); i++){
			byte curByte =  Integer.valueOf(number.charAt(i)+"").byteValue();
			result[len-i-1] = curByte;
		}
		
		return result;
	}
	
	public static Byte[] Add(Byte[] number1, Byte[] number2){
		int len = (number1.length>number2.length) ? number1.length : number2.length;
		Byte[] result = new Byte[len+1];
		Integer sum = new Integer(0);
		Integer carry = new Integer(0);
		int i;
		if(number1.length>number2.length){
			for(i=0; i<number2.length; i++){
				sum = number1[i].intValue() + number2[i].intValue();				
				sum = sum +carry;
				carry = ((sum -10)>=0) ? 1:0;
				sum = ((sum -10)>=0) ? (sum-10):sum;
				result[i] = sum.byteValue();
				sum = 0;
			}
			for(;i<number1.length;i++){
				sum = number1[i] +carry;
				carry = ((sum -10)>=0) ? 1:0;
				sum = ((sum -10)>=0) ? (sum-10):sum;
				result[i] = sum.byteValue();
				sum = 0;
			}
			if(carry!=0){
				result[i] = carry.byteValue();
			}else{
				result[i] = 0;
			}
		}else{
			for(i=0; i<number1.length; i++){
				sum = number1[i].intValue() + number2[i].intValue();				
				sum = sum +carry;
				carry = ((sum -10)>=0) ? 1:0;
				sum = ((sum -10)>=0) ? (sum-10):sum;
				result[i] = sum.byteValue();
				sum = 0;
			}
			for(;i<number2.length;i++){
				sum = number2[i].intValue() + carry;
				carry = ((sum -10)>=0) ? 1:0;
				sum = ((sum -10)>=0) ? (sum-10):sum;
				result[i] = sum.byteValue();
				sum = 0;
			}
			if(carry!=0){
				result[i] = carry.byteValue();
			}else{
				result[i] = 0;
			}
		}
		
		return result;
	}
	//level表示左移次数
	public static Byte[] left_shift(Byte[] number, int level){
		Byte[] result = new Byte[number.length+level];
		Integer zero = 0;
		for(int i=0; i<level; i++){
			result[i] = zero.byteValue();
		}
		for(int i=0; i<number.length; i++){
			result[i+level] = number[i];
		}
		return result;
	}
	
	//乘法计算过程中被乘数总是与成数的一位相乘
	public static Byte[] MultiplyOne(Byte[] number1, Byte number2){
		Byte[] result = new Byte[number1.length+1];
		Integer cur = 0;
		Integer carry = 0;
		Integer zero = 0;
		int i;
		Arrays.fill(result, zero.byteValue());
		
		for(i=0; i<number1.length; i++){
			cur = number1[i].intValue()*number2.byteValue();
			cur = cur +carry;
			carry = cur/10;
			cur = cur%10;
			result[i] = cur.byteValue();
			cur = 0;
		}
		if(carry==0){
			result[i] = cur.byteValue();
		}else{
			result[i] = carry.byteValue();
		}
		
		return result;
	}

	public static Byte[] Multiply(Byte[] number1, Byte[] number2){
		Byte[] result = new Byte[number1.length+1];
		Byte[] before = new Byte[number1.length];
		Integer zero = 0;
		Arrays.fill(before, zero.byteValue());
		
		for(int i=0; i<number2.length; i++){
			result = MultiplyOne(number1, number2[i]);
			result = left_shift(result, i);
			result = Add(result, before);
			before = result;

		}
		
		return result ;
	}
	
	public static void print(Byte[] result){
		for(int i=0; i<result.length; i++){
			System.out.print(result[i]+"  ");
		}
		System.out.println();
	}


public static void main(String[] args){
		Integer one = 1;
		Byte[] result = new Byte[1];
		result[0] = one.byteValue();
		long t1 = System.currentTimeMillis();
		for(Integer i=2; i<=100; i++){
			Byte[] cur = BigNumber.BigNumber.StringToByte(i+"");
			result = BigNumber.BigNumber.Multiply(result, cur);
		}
		int sum = 0;
		for(int i=0; i<result.length; i++){
			sum += result[i].intValue();
		}
		long t2 = System.currentTimeMillis();
		BigNumber.BigNumber.print(result);
		System.out.println(sum);
		System.out.println((t2-t1));
	}
分享到:
评论

相关推荐

    计算机网络第六版答案

    Computer Networking: A Top-Down Approach, 6th Edition Solutions to Review Questions and Problems Version Date: May 2012 ...This document contains the solutions to review questions ...Problem 1 There...

    MySQL数据库考试试题.docx

    20. 实体完整性:设置外键(Problem 20) 设置外键是一种实现实体完整性的方法。 21. 删除视图:DROP VIEW 语句(Problem 21) DROP VIEW 语句用于删除一个视图。 22. 修改表结构:ALTER TABLE 语句(Problem 22...

    Computer-Based.Problem.Solving.Process

    Title: Computer-Based Problem Solving Process ...Chapter 20. Timing Program Execution Chapter 21. Efficiency of Batch Operating Systems Chapter 22. Convenience of the BOS Chapter 23. Real-Time Systems

    Problem Solving with C++, 10th Global Edition

    10th edition edition (November 20, 2017) Language: English ISBN-10: 1292222824 ISBN-13: 9781292222820 For courses in C++ introductory programming. Learn the fundamentals of C++ programming with an ...

    Problem_C_Data.zip

    美赛20年C题可能涉及的主题广泛,可能是自然科学、社会科学、工程或经济学等领域的实际问题。题目通常会给出一些背景信息,并提出一个开放性的问题,要求参赛团队运用数学模型来解决。在这个压缩包中,"Problem_C_...

    Java An Introduction to Problem Solving and Programming

    - **编译Java程序**: 第20页提到编译过程,这是Java程序开发中的基础步骤,涉及到将源代码转换成可执行文件。 - **编写算法**: 在第25页提到了算法的概念,算法是解决问题的精确步骤,编程的核心就是将算法转化为...

    leet_leetcode_grownhcm_algorithm_

    有效的括号"可能会被命名为"有效括号.py"或"problem20.py"。 基于以上信息,我们可以推测这个压缩包可能包含以下知识点: 1. **基础数据结构**:如数组、链表、栈、队列、树(二叉树、平衡树)、图等,这些都是...

    Problem - 1001.pdf

    20 20 22 根据题目描述,我们可以采用数据结构如并查集或者二维四向链接来处理矩形的合并与周长计算。首先,我们需要记录每个矩形的信息,然后根据矩形的覆盖情况更新黑色区域的周长。每次增加一个矩形时,需要检查...

    英语必修一二基础词汇复习大全.pdf

    19. 解决问题:solve a problem 20. 一个讲英语的国家:an English-speaking country **Unit 3 Travel Journal** 1. 梦想做某事:dream of doing sth. 2. 毕业于(某大学):graduate from 3. 说服某人做某事:...

    Prime Ring Problem 深度探索

    ### Prime Ring Problem 深度探索 #### 问题背景与定义 在计算机科学与算法竞赛领域,特别是ACM比赛中,经常会出现一类与数学紧密结合的问题,其中“Prime Ring Problem”(简称PRP)就是一个典型例子。该问题的...

    英语必修一二基础词汇复习大全.doc

    20. **一个讲英语的国家** - an English-speaking country 而在Unit 3 Travel Journal中,我们接触了旅行和日记相关的词汇: 1. **梦想做某事** - dream of doing something 2. **毕业于〔某大学〕** - graduate ...

    project euler problem 5

    在Project Euler的问题集中,问题5要求我们找到能被1至20所有数字整除的最小正整数。这个问题实际上是在寻找这组数字的最小公倍数(LCM)。对于较小的参数值,如本例中的k=20,可以不借助编程手段直接计算出结果。...

    Problem Solving in Data Structures & Algorithms Using Java

    Title: Problem Solving in Data Structures & ...CHAPTER 20: BACKTRACKING AND BRANCH-AND-BOUND CHAPTER 21: COMPLEXITY THEORY AND NP COMPLETENESS CHAPTER 22: INTERVIEW STRATEGY CHAPTER 23: SYSTEM DESIGN

    子数组最大和 Maximal Contiguous Subsequent Sum Problem

    ### 子数组最大和问题(Maximal Contiguous Subsequent Sum Problem) #### 一、问题定义与背景 在计算机科学领域,子数组最大和问题(Maximal Contiguous Subsequent Sum Problem)是一个经典的问题,旨在从一个...

    Problem A:放苹果

    第一行是测试数据的数目t(0 &lt;= t &lt;= 20)。以下每行均包含二个整数M和N,以空格分开。1,N。 Output 对输入的每组数据M和N,用一行输出相应的K。 Sample Input 1 7 3 Sample Output 8

Global site tag (gtag.js) - Google Analytics