`
Programmer2.x
  • 浏览: 11084 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

。。。。。

阅读更多
。。。。。
分享到:
评论
8 楼 donnki 2008-12-31  
怎么重复发了次。。。麻烦斑猪删一条谢谢。
main函数在最后
调用strAdd(bignumber1, bignumber2)实现超大数相加
调用multiply(bignumber1, bignumber2)实现超大数相乘
7 楼 donnki 2008-12-31  
刚翻出很多以前写的一段代码。

之所以import java.math.BigInteger是为了验证程序正确性,实际算法里不包含BigInteger类

import java.math.BigInteger;
import java.util.*;
public class MyBigIntegerAdd {
/**
 * 实现超大整数相加、相乘。
 */
	private static int[] str2int(String bigNumber) {
		//System.out.println(bigNumber.length());
		int[] array;
		if (bigNumber.length() < 10) {
			array = new int[1];
			array[0] = Integer.parseInt(bigNumber);
		} else {
			array = new int[bigNumber.length() % 9 == 0 ? bigNumber.length() / 9 : (bigNumber.length() / 9 + 1)];
			StringBuffer buf = new StringBuffer(bigNumber);
			buf.reverse();

			for (int i = 0; i < array.length; i++) {
				array[i] = Integer
						.parseInt((new StringBuffer(buf.substring(i * 9,
								(i + 1) * 9 > bigNumber.length() ? bigNumber
										.length() : (i + 1) * 9)).reverse())
								.toString());
				// System.out.println(array[i]);
			}
		}
		return array;
	}

	
	private static String add(int[] a, int[] b) {
		int t = 0;
		int[] larger = (a.length > b.length ? a : b);
		int[] lower = (a.length > b.length ? b : a);
		int[] tmp = new int[larger.length];
		for (int i = 0; i < tmp.length; i++) {
			if (i < lower.length) {
				if (a[i] + b[i] + t > 1000000000 -1 ) {
					tmp[i] = a[i] + b[i] + t - 1000000000;
					t = 1;

				} else {
					tmp[i] = a[i] + b[i] + t;
					t = 0;
				}
			}else if(i > lower.length){
				tmp[i] = larger[i] + t;
			}
		}
		StringBuffer buf = new StringBuffer();
		for (int i = tmp.length - 1; i >= 0; i--) {
			StringBuffer str = new StringBuffer(Integer.toString(tmp[i]));
			int strlen = str.length();
			if(strlen != 9 && i!=tmp.length-1){
				for(int x=0; x<9-strlen; x++){
					str.insert(0, "0");
				}
			}
			buf.append(str.toString());
		}
		return buf.toString();
	}
	public static String strAdd(String a, String b){
		int[] a1 = str2int(a);
		int[] b1 = str2int(b);
		return add(a1,b1);
	}
	
	private static String multiplyNumber(String bigNumber, int number){
		if(number == 0){
			return "0";
		}
		String tmp = bigNumber;
		
		while(number-- > 1){
			tmp = strAdd(tmp, bigNumber);
		}
		return tmp;
	}

	public static String multiply(String a1, String a2){
		ArrayList<String> list = new ArrayList<String>();
		StringBuffer buf = new StringBuffer(a1).reverse();
		for(int i=0; i<buf.length(); i++){
			Character c = buf.charAt(i);
			int number = Integer.parseInt(c.toString());
			StringBuffer tmp = new StringBuffer(multiplyNumber(a2, number));
			for(int t=0; t<i; t++){
				tmp.append("0");
			}
			list.add(tmp.toString());
		}
		String tmpStr = list.get(0);
		for(int i=1; i<list.size(); i++){
			tmpStr = strAdd(list.get(i), tmpStr);
		}
		
		return tmpStr;
	}
	public static void main(String[] args) throws Exception{
		Long startTime = System.currentTimeMillis();
		String s1 = "1111111111111111111111111111111111111111111111111111111111111111111111111111";
		String s2 = "1111111111111111111111111111111111111111111111111111111111111111111111111111";
		System.out.println(multiply(s1, s2));
		Long endtime = System.currentTimeMillis();
		System.out.println("Cost Time:" + (endtime-startTime) + "ms.");
		
		startTime = System.currentTimeMillis();
		BigInteger b1 = new BigInteger("1111111111111111111111111111111111111111111111111111111111111111111111111111");
		BigInteger b2 = new BigInteger("1111111111111111111111111111111111111111111111111111111111111111111111111111");
		System.out.println(b1.multiply(b2));
		
		endtime = System.currentTimeMillis();
		System.out.println("Cost Time:" + (endtime-startTime) + "ms.");
	}
}

6 楼 donnki 2008-12-31  
刚翻出很多以前写的一段代码。

之所以import java.math.BigInteger是为了验证程序正确性,实际算法里不包含BigInteger类

import java.math.BigInteger;
import java.util.*;
public class MyBigIntegerAdd {
/**
 * 实现超大整数相加、相乘。
 */
	private static int[] str2int(String bigNumber) {
		//System.out.println(bigNumber.length());
		int[] array;
		if (bigNumber.length() < 10) {
			array = new int[1];
			array[0] = Integer.parseInt(bigNumber);
		} else {
			array = new int[bigNumber.length() % 9 == 0 ? bigNumber.length() / 9 : (bigNumber.length() / 9 + 1)];
			StringBuffer buf = new StringBuffer(bigNumber);
			buf.reverse();

			for (int i = 0; i < array.length; i++) {
				array[i] = Integer
						.parseInt((new StringBuffer(buf.substring(i * 9,
								(i + 1) * 9 > bigNumber.length() ? bigNumber
										.length() : (i + 1) * 9)).reverse())
								.toString());
				// System.out.println(array[i]);
			}
		}
		return array;
	}

	
	private static String add(int[] a, int[] b) {
		int t = 0;
		int[] larger = (a.length > b.length ? a : b);
		int[] lower = (a.length > b.length ? b : a);
		int[] tmp = new int[larger.length];
		for (int i = 0; i < tmp.length; i++) {
			if (i < lower.length) {
				if (a[i] + b[i] + t > 1000000000 -1 ) {
					tmp[i] = a[i] + b[i] + t - 1000000000;
					t = 1;

				} else {
					tmp[i] = a[i] + b[i] + t;
					t = 0;
				}
			}else if(i > lower.length){
				tmp[i] = larger[i] + t;
			}
		}
		StringBuffer buf = new StringBuffer();
		for (int i = tmp.length - 1; i >= 0; i--) {
			StringBuffer str = new StringBuffer(Integer.toString(tmp[i]));
			int strlen = str.length();
			if(strlen != 9 && i!=tmp.length-1){
				for(int x=0; x<9-strlen; x++){
					str.insert(0, "0");
				}
			}
			buf.append(str.toString());
		}
		return buf.toString();
	}
	public static String strAdd(String a, String b){
		int[] a1 = str2int(a);
		int[] b1 = str2int(b);
		return add(a1,b1);
	}
	
	private static String multiplyNumber(String bigNumber, int number){
		if(number == 0){
			return "0";
		}
		String tmp = bigNumber;
		
		while(number-- > 1){
			tmp = strAdd(tmp, bigNumber);
		}
		return tmp;
	}

	public static String multiply(String a1, String a2){
		ArrayList<String> list = new ArrayList<String>();
		StringBuffer buf = new StringBuffer(a1).reverse();
		for(int i=0; i<buf.length(); i++){
			Character c = buf.charAt(i);
			int number = Integer.parseInt(c.toString());
			StringBuffer tmp = new StringBuffer(multiplyNumber(a2, number));
			for(int t=0; t<i; t++){
				tmp.append("0");
			}
			list.add(tmp.toString());
		}
		String tmpStr = list.get(0);
		for(int i=1; i<list.size(); i++){
			tmpStr = strAdd(list.get(i), tmpStr);
		}
		
		return tmpStr;
	}
	public static void main(String[] args) throws Exception{
		Long startTime = System.currentTimeMillis();
		String s1 = "1111111111111111111111111111111111111111111111111111111111111111111111111111";
		String s2 = "1111111111111111111111111111111111111111111111111111111111111111111111111111";
		System.out.println(multiply(s1, s2));
		Long endtime = System.currentTimeMillis();
		System.out.println("Cost Time:" + (endtime-startTime) + "ms.");
		
		startTime = System.currentTimeMillis();
		BigInteger b1 = new BigInteger("1111111111111111111111111111111111111111111111111111111111111111111111111111");
		BigInteger b2 = new BigInteger("1111111111111111111111111111111111111111111111111111111111111111111111111111");
		System.out.println(b1.multiply(b2));
		
		endtime = System.currentTimeMillis();
		System.out.println("Cost Time:" + (endtime-startTime) + "ms.");
	}
}

5 楼 Programmer2.x 2008-12-31  
感谢朋友们的回复。。
4 楼 Programmer2.x 2008-12-31  
gembler 写道
你想表达什么呢?


btw:
Programmer2.x 写道

if (i > 0) {
    System.out.println();
}

这里好恶心


题目里有这么一行:Output a blank line between two test cases.

我暂时是这么处理的,请问您有何高见?
3 楼 xuyao 2008-12-31  
看意思,楼主好像要表达,两个int相加超过范围的问题,是啊,java很简单,biginteger。可以先向左移位,高4位和低四位。
2 楼 superdandy 2008-12-31  
没看懂。 这里有什么很复杂的地方么? 用java的话,BigInteger, BigDecimal都为你解决了。

用C来实现,方是你的本事
1 楼 gembler 2008-12-30  
你想表达什么呢?


btw:
Programmer2.x 写道

if (i > 0) {
    System.out.println();
}

这里好恶心

相关推荐

    OAuth2.0 JAVA服务端和客户端功能实现(带jar包)

    OAuth2.0是一种广泛使用的授权框架,用于保护API和Web应用的安全。在Java环境中实现OAuth2.0,我们可以分为服务端(Authorization Server)和客户端(Resource Owner)两个部分。这个压缩包提供了完整的OAuth2.0...

    http 协议解析类 c++

    能够处理http协议:(1)解析 (2)构造http格式

    jsp音乐网站源代码

    【标题】:“jsp音乐网站源代码”涉及到的是一个基于JSP技术构建的在线音乐平台的源码实现。这个项目可能包含用户浏览、搜索、播放音乐的功能,并可能支持用户注册、登录以及个人收藏等功能。 ...

    iText-2.0.8.jar

    iText-2.0.8.jar,Freemarker+Flying sauser +Itext 整合生成PDF需要的JAR包,配合core-renderer.jar一起使用

    ant.jar 一个很好的ant包。。。

    一个很好的ant包。。。 封装了Java中打成zip & rar 的工具类 很实用

    C# 可作弊的抽奖程序 vs2005

    给某个单位做的,正式使用过,请大家不要给人家透漏单位。曾经使用过,现在已经不在使用了,抽奖嘛,每次都是不一样的逻辑啦。有设定中奖名单功能 使用vs2003开发,后来可能使用2005打开过,Xml文件存储简单数据

    基于ssh架构的学生信息管理系统

    基于ssh架构的学生信息管理系统,内打包的是个完整的工程,直接导入myeclipse即可。管理员登陆,采用struts titles 布局页面。可输入关键字查询学生,列出全部学生信息,增加,删除,修改,查询,分页等等,各个小...

    Matlab数字图像处理技术论文(27篇)主要关于图像增强(下)

    在图像的形成、 传输或变换过程中 ,由于受到多种因素的影响 ,如光学系统失真、 系统噪声、 曝光不足 或过量、 相对运动等 ,图像往往与原始景物之间或图像与原始图像之间产生某种差异.降质或退化的图像 ...

    文档分享网站(文档上传、在线预览、下载)使用jsp+mysql

    在IT行业中,构建一个文档分享网站是常见的需求,特别是对于教育、企业以及个人用户来说,这样的平台能够方便地存储、共享和交流各种类型的文档。本项目以“文档分享网站(文档上传、在线预览、下载)使用jsp+mysql...

    cetsix.txt(英语字典数据库)

    ### cetsix.txt(英语字典数据库) #### 知识点概述 `cetsix.txt`文件是一个英语字典数据库,包含了大量的英语词汇及其解释、例句等信息。本文件覆盖了从基础词汇到较为复杂的术语,对于学习英语词汇、语法及实际...

    glibc-common-2.5-81.el5_8.1.x86_64.rpm

    有需要glibc-2.5-81.x86_64.rpm的,在我资源里

    Struts2+ajax+json异步上传图片回显

    Struts2是一个流行的Java web框架,它为开发者提供了一种模型-视图-控制器(MVC)架构,便于构建可维护、结构清晰的Web应用程序。在Struts2中,我们经常需要处理用户上传的文件,比如图片。在这个场景中,“Struts2+...

    129个Java项目源码下载 [共分20个压缩卷] 【08】.zip

    这个压缩包文件“129个Java项目源码下载 [共分20个压缩卷] 【08】.zip”是Java开发领域的宝贵资源,包含了129个不同的Java项目源代码,这些项目可能涵盖了各种Web应用的实现。在学习和理解Java Web开发时,这些源码...

    Android40个经典源码

    1 Android PDF 阅读器源码 2 Android Txt文本阅读器源码 3 Android SqliteManager 源码 4 Android 个人记账程序源码 5 android 多点触控实例源码 6 android 画图程序 7 Android 手电筒源码 8 Android 天气预报加...

    SolidWorks2012破解文件

    可顺利破解SolidWorks2012SP0

    ado方式操作数据库封装类的使用范例

    在.NET编程环境中,ADO(ActiveX Data Objects)是一种常见的用于访问数据库的技术,它提供了一种高效、方便的方式来处理SQL查询和数据操作。本示例"ado方式操作数据库封装类的使用范例"主要展示了如何利用ADO.NET...

    最新版bibexcel

    文献分析的强大工具,是科学计量学,文献计量学常用的软件。

    C语言编程常见问题解答.pdf

    这是一本忖门解答C语言编程常见问题的著作。书中所覆盖的内容相当广泛,并附有大量鲜明的例子。

    Zigbee2007协议栈.

    Zigbee2007协议栈是Zigbee联盟在2007年推出的一种无线通信标准,专门针对低功耗、低数据速率的物联网应用。这个协议栈基于IEEE 802.15.4标准,为智能家居、工业自动化、医疗保健等领域提供了一种经济高效的解决方案...

Global site tag (gtag.js) - Google Analytics