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

这里好恶心

相关推荐

    win7 ghost一键备份还原软件

    win7 ghost一键备份还原软件 Windows7轻松备份--“Windows7一键恢复”简明教程 1. Windows7一键恢复简介 Windows7一键恢复是基于ghost(v11.02)和grub4dos的系统备份和还原工具,具有良好的兼容性和易用性。...

    PHP 在线答题系统

    【PHP在线答题系统】是一种基于PHP编程语言构建的交互式平台,用于实现在线测试和学习功能。这样的系统通常包括用户登录、题目展示、选择答案、提交答案以及结果显示等核心模块。下面将详细介绍PHP在线答题系统的...

    MySQL5.7 帮助文档(官网下载)

    更多资源详见: http://blog.csdn.net/fanxiaobin577328725/article/details/51894331 (包含图书各部分和随书源码,还有其它资源的详细下载地址)

    中国省市县三级json数据

    中国省市县三级json数据(部分数据) [{"code":"110000","sheng":"11","di":"00","xian":"00","name":"北京市","level":1},{"code":"110100","sheng":"11","di":"01","xian":"00","name":"市辖区","level":2},{"code...

    C# 可作弊的抽奖程序 vs2005

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

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

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

    pdf.js使用文件流预览pdf

    PDF.js是一个开源JavaScript库,由Mozilla开发,用于在Web浏览器中渲染PDF文档,无需依赖任何插件。这个库的目标是提供一个与平台和浏览器无关的解决方案,使得用户可以在任何支持HTML5的浏览器上查看PDF文件。...

    mysql server5.5

    mysql5.5数据库,适合于Windows64位的操作系统。安装之后还需要相关的配置,安装配置很简单。

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

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

    ALIENTEK 战舰STM32 标准例程-V3.5库函数版本

    《ALIENTEK战舰STM32标准例程-V3.5库函数版本详解》 ALIENTEK战舰STM32标准例程V3.5库函数版本是一款专为STM32微控制器设计的开发资源,旨在帮助开发者快速理解和掌握STM32的库函数使用方法,实现高效、稳定的...

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

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

    Neural networks: A comprehensive foundation第二部分

    神经网络的原版英文书,作者为S. Haykin,第二版,包括感知器,径向基函数,支撑向量机,主元素分析等,非常详细。写英文文章首选参考文献! 注意:原文件&gt;20M,这里分拆成两个,必须都下载才能解压!

    matplotlib-1.4.0.win32-py2.7.exe

    matplotlib-1.4.0.win32-py2.7.exe 共享下,方便大家,无需资源分,只希望给个好评

    Java Web开发教程

    Java Web开发教程主要涵盖了一系列用于构建Web应用程序的技术和框架,这些技术使得开发者能够创建功能丰富的、交互式的网页应用。在本教程中,我们将深入探讨Java Web开发的核心概念、技术和工具。...

    C++ Library Reference

    www.cplusplus.com上的c++ reference是我见过最好的,只可惜没有打包的,于是本人用工具把那些网页批量下载下来,做成chm文档供大家使用,方便别人就是方便自己. chm可能对css支持不太好.

    Java Socket聊天室

    Java Socket聊天室是一种基于Java编程语言实现的网络通信应用,它利用了Socket接口来构建一个局域网内的多人聊天环境,类似于QQ群的功能。在这个项目中,开发者运用了多线程技术来处理并发的用户交互,同时利用...

    Real Time Rendering.3rd

    Real Time Rendering !!!

    Qt编写TCP通讯程序详细教程及代码客户端与服务器端

    说明:这是基于Qt编写的TCP通讯程序测试程序,包括客户端与服务器端,里面包含超级详细教程及代码。这是本人的练手之作,学习这个程序花费了大量时间,学习过程中借鉴了网友的成果。现在百忙之中将我的学习成果制作...

    Java网络编程-Socket-文件传输小案例

    package com.kum.im.file; import java.nio.channels.SocketChannel; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.ByteBuffer; import java.io.RandomAccessFile...

Global site tag (gtag.js) - Google Analytics