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

这里好恶心

相关推荐

    免费淘宝自动发货软件

    淘宝自动发货软件是一种提高电商运营效率的工具,尤其对于销售虚拟商品的商家而言,它可以极大地简化发货流程,节省时间和精力。这款免费的淘宝自动发货软件能够实现自动化处理订单,一旦有新的购买,系统会自动完成...

    glaux.h

    DEV-CPP中没有的头文件。

    android 音量控制 定时 震动 静音 铃声 情景模式 设置

    在Android系统中,音量控制、定时、震动、静音以及铃声等元素构成了用户交互的重要部分,而情景模式的设置则进一步提升了用户体验。本文将深入探讨这些知识点,并结合一个小型示例进行解析。 首先,音量控制是...

    Managed DirectX 9.0 SDK 文档中文译本

    Managed DirectX 9.0 SDK 是微软提供的一套用于开发DirectX应用程序的开发工具包,它包含了大量的编程接口(APIs)、示例代码、文档以及工具,使得开发者能够使用C#等.NET语言创建高性能的图形、音频和游戏应用。...

    JAVA 网上书城开发实例

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

    QQ聊天界面iOS源代码素材

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

    BOIS密码清除工具 直接在windows系统里面加载驱动,就可以清除BIOS密码

    此程序由汇编所写,只有608字节。 直接在windows系统里面加载驱动,就可以清除BIOS密码 此程序为驱动程序,使用KmdManager.exe或其它驱动加载程序加载启动此驱动程序,即可将BIOS密码清空。 注意:此程序不可用于...

    Apache ab 下载

    Apache ab下载,冲apache安装目录拿出来的。也不用为了使用ab而安装Apache。ab.exe

    PHP开发API接口的实例代码下载

    分享一例php实现API接口的代码,实现用户的注册、登录、查询用户信息的功能,是学习PHP API开发的不错实例

    通过Excel管理表结构自动生成创建表sql文支持(sqlserver,oracle)

    在excel中方便地管理数据库表结构,通过管理的结构自动生成创建表sql文,支持生成sqlserver脚本和oracle脚本;模板默认都是sqlserver数据库字段类型,只需要把oracle对应的类型对应关系维护一下就可以自动生成oracle...

    取电脑CPU序列号、网卡MAC地址、主板BIOS、操作系统序列号

    所取序列号包括: 1.CPU序列号 2.硬盘物理序列号 3.网卡序列号 4.操作系统序列号 5.Bios Type 6.Bios Copyright 7.Bios Date 8.Bios Extended Info 最重要了,可以做序列号使用 适合D4,D5,D6,D7,CB4,CB5或更...

    echarts3.2.3力导向图示例

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

    notepad++ 16进制插件

    Notepad++是一款非常受欢迎的免费源代码编辑器,尤其在程序员和开发者中广泛使用。它支持多种编程语言,并且允许用户自定义语法高亮。在标题和描述中提到的"notepad++ 16进制插件",指的是Notepad++的一个扩展功能,...

    cp2102驱动程序 win7可用

    【标题】"cp2102驱动程序 win7可用" 指的是适用于Windows 7操作系统的CP2102 USB至UART桥接器的驱动程序。CP2102是一款由Silicon Labs(芯科实验室)开发的USB到UART(通用异步接收发送器)接口芯片,广泛应用于各种...

    ZXing core.jar 3.1.0

    ZXing 条形码/二维码 开发包之core.jar

    《C#开发宝典》例子源代码

    《C#开发宝典》是一本深入探讨C#编程技术的书籍,其提供的例子源代码涵盖了多个关键领域的应用,旨在帮助读者巩固理论知识并提升实际编程能力。在这些章节的源代码中,我们可以学习到一系列重要的C#编程知识点: ...

    java-多线程下载器(支持断点续传、线程加减)包含源码和可运行jar包 第二版

    注意: 如果下载后无法直接运行,则查看电脑是否有F盘,如果没有,可修改jar包中的配置文件,将默认路径设置到其他盘,如C盘 说明: 1、这是myDownloader2.0自制下载器,在1.0版本的基础上做了修正和功能上的扩展;...

    ViewPager+GridView实现宫格横向滑动切换

    在Android开发中,创建引人入胜的用户界面是至关重要的。`ViewPager`和`GridView`是两个常用组件,它们可以结合使用以实现创新的UI设计。本篇将深入探讨如何利用`ViewPager`和`GridView`来实现宫格横向滑动切换的...

Global site tag (gtag.js) - Google Analytics