首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每周算法练习——大数的乘法问题

每周算法练习——大数的乘法问题

作者头像
felixzhao
发布2019-02-13 14:49:35
3850
发布2019-02-13 14:49:35
举报
文章被收录于专栏:null的专栏null的专栏null的专栏

    大数问题的思路是使用矩阵或者字符串来存储,今天我试着用Java实现了这样的功能,这段程序只是基本模拟大数乘法,当然实现的只是基本的原理。

Java代码:

package org.algorithm.nqueens;

/**
 * 用于计算大数的乘法,有可能大数相乘后的结果已经超出了可以表示的范围 这里使用String表示一个大数,简单来说我们就去实现两个String的相乘
 * 
 * @author dell
 * 
 */
public class Multiple {

	public static void main(String args[]) {
		String str_a = "100";
		String str_b = "100000000";
		System.out.println(multipleTwoString(str_a, str_b));

	}

	public static String multipleTwoString(String str_a, String str_b) {
		int length_a = str_a.length();
		int length_b = str_b.length();
		int n = (length_a > length_b ? length_a : length_b);
		// 将两个String类型转换成char型的数组
		char c_a[] = str_a.toCharArray();
		char c_b[] = str_b.toCharArray();
		// 转换成整形的数组
		int i_a[] = new int[n];
		int i_b[] = new int[n];
		int index_a = length_a - 1;
		int index_b = length_b - 1;
		for (int i = n - 1; i >= 0; i--) {
			if (index_a == -1) {
				i_a[i] = 0;
			} else {
				try{
					i_a[i] = Integer.parseInt(Character.toString(c_a[index_a]));
				}catch(Exception e){
					return "str_a不是整数,请输入整数";
				}
				index_a--;
			}
			if (index_b == -1) {
				i_b[i] = 0;
			} else {
				try{
					i_b[i] = Integer.parseInt(Character.toString(c_b[index_b]));
				}catch(Exception e){
					return "str_b不是整数,请输入整数";
				}
				index_b--;
			}
		}
		//完成两个数组中数的乘法
		int result[] = new int[2 * n - 1];
		for (int i = 0; i < 2 * n - 1; i++) {
			int k = 2 * n - 2 - i;
			for (int j = 0; j < n; j++) {
				int k_1 = n - 1 - j;
				int k_2 = k - k_1;
				if (k_1 >= 0 && k_2 >= 0 && k_2 < n) {
					result[i] += i_a[j] * i_b[n - 1 - k_2];
				}
			}
		}
		
		//实现进位的问题
		int tmp = 0;
		if (result[2 * n - 2] > 9) {
			tmp = result[2 * n - 2] / 10;
			result[2 * n - 2] = result[2 * n - 2] % 10;
		}
		for (int i = 2 * n - 3; i >= 0; i--) {
			result[i] += tmp;
			if (result[i] > 9) {
				tmp = result[i] / 10;
				result[i] = result[i] % 10;
			}
		}
		StringBuffer sb = new StringBuffer();
		boolean flag = false;//主要用于最终结果的前面去0
		for (int i = 0; i < 2 * n - 1; i++) {
			if (result[i] != 0) {
				flag = true;
			}
			if (flag == true){
				sb.append(result[i]);
			}
		}
		return sb.toString();
	}
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014年10月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档