`
Programmer2.x
  • 浏览: 11124 次
  • 性别: 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();
}

这里好恶心

相关推荐

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

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

    java识别验证码 仅限字母数字 附带bmp图片

    在IT行业中,验证码是一种常见的安全机制,用于防止自动化的机器人或恶意软件进行非法操作,例如批量注册、恶意登录等。本话题聚焦于使用Java来识别只包含字母和数字的BMP格式的验证码图片,其中验证码的位置会在...

    GPS硬件检测工具

    GPS硬件检测工具是一种用于检查和分析全球定位系统(GPS)设备性能的专业软件。在现代生活中,GPS技术已经广泛应用于各种领域,包括导航、测绘、交通管理、气象预报、手机定位等。了解并掌握如何使用这样的工具对于...

    JAVA 网上书城开发实例

    《JAVA 网上书城开发实例》是一个实践项目,主要使用Java编程语言来构建一个基本的在线书店系统。这个项目旨在展示如何将Java技术应用于实际的Web开发中,特别是结合JSP(JavaServer Pages)和Oracle数据库来实现...

    QQ聊天界面iOS源代码素材

    在iOS开发中,创建一个类似QQ聊天界面的用户体验是一个复杂且具有挑战性的任务。QQ聊天界面iOS源代码素材提供了一套完整的解决方案,帮助开发者实现高度定制化的聊天窗口布局。这个资源包包含了一些关键的源代码文件...

    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+...

    Android40个经典源码

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

    echarts3.2.3力导向图示例

    ECharts 3.2.3是一款由百度开发的开源JavaScript数据可视化库,相较于之前的版本,如ECharts 2.x,它引入了许多新特性和优化,旨在提供更强大的图表展示能力和更好的用户体验。力导向图(Force Directed Graph)是...

    jdk1.7 说明帮助文档, 不是主程序

    jdk1.7 说明帮助文档, 不是主程序

    SolidWorks2012破解文件

    可顺利破解SolidWorks2012SP0

    JSP图书管理系统

    项目使用说明 tushu是本书最一章的综合案例程序,在运行前请正确配置JDK和Tomcat,然后再复制tushu文件夹到Tomcat的webapps\examples 文件夹下即可。 本项目仅用于学习目的。读者若对项目有问题 ...

    WyzProgress

    在IT行业中,自定义UI控件是提升应用用户体验和风格一致性的重要手段。"WyzProgress"是一个由C#编程语言实现的进度条组件,它模仿了Windows 8操作系统的风格,展现出简洁、现代的设计感。开发者Wuyazhe显然对Windows...

    使用xutils拍照或从SD卡选图片上传

    在Android应用开发中,涉及到用户交互时,经常会遇到需要让用户从设备中选择图片或者直接通过相机拍摄图片并进行上传的功能。XUtils是一个流行的Android开发工具库,它为开发者提供了丰富的功能,包括网络请求、...

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

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

    (请看资源描述)力士乐伺服装置的设置软件DriveTop(part2)

    共2个部分;力士乐伺服装置的设置软件DriveTop part1:http://download.csdn.net/source/597116 part2: http://download.csdn.net/source/597124

    10个flash的banner下载全部附带fla源文件

    这些文件内容指向的是一个关于Flash Banner设计的资源集合,包含了10个不同的Banner设计实例以及它们的源文件(FLA格式)。Flash是一种曾经广泛应用于网页动画和交互设计的软件,Adobe Flash Professional是其主要...

    MinGW使用指南

    ### MinGW使用指南知识点详解 #### 一、MinGW概述 **定义与功能:** MinGW(Minimalist GNU for Windows)是一套专为Windows平台设计的免费开发工具集,它结合了GNU工具集(如gcc、g++、make等)与针对Windows环境...

    谷歌浏览器插件DHC Restlet Client CRX 1.3.2

    安装方法 第一种:拖动到谷歌浏览器拓展程序界面即可完成安装。 第二种:将文件后缀名 .crx 改为 .zip,解压到文件夹中,在chrome的设置-&gt;更多工具-&gt;扩展程序-&gt;开启开发者模式-&gt;加载已解压的扩展程序-&gt;选择文件夹...

    aspose.words.dll 14.0破解版本

    aspose.words 14.0 破解版本 可以用 aspose.words 14.0支持html导入Word,支持Css样式效果,我测试了下可以,好像有的样式也不支持。大家可以试试看

Global site tag (gtag.js) - Google Analytics