英雄会-----任意长度的两个正整数相乘

任意长度的两个正整数相乘

题目:

       两个大数相乘:char* multiply(char*,char*)。给了两个字符串,每个都是代表了一个很长的10进制表示的数, 比如 String str1 = "23456789009877666555544444"; String str2 = "346587436598437594375943875943875", 最后求出它们的乘积。 不用jdk的数学运算包BigInteger.或者类似的包。


思考:

       这是一个大数相乘为题,大家都知道int、long等变量表示的数值有限,当出现超过这个限度的数值计算的时候,就是一个大数的计算问题,就需要用到数组了。
大致思想就是,把改进位的先保存,先不进位,保存到数组中,计算出"每一位“的值之后,在从"最低位"开始往高位进位。
之前写过c的代码:
/*问题描述:当两个数比较大的时候就会出现溢出的现象。
  解决方案:利用数组来保存结果。*/

#include <stdio.h>
#include <string.h>

#define MAX 100
unsigned arr1[MAX+10];
unsigned arr2[MAX+10];
unsigned result[MAX*2+10];
char str1[MAX+10];
char str2[MAX+10];


int main()
{
	int len1 = 0, len2 = 0, len3 = 0, i, j = 0;
	int flag = 0;
	//
	memset(arr1, 0, sizeof(arr1));
	memset(arr2, 0, sizeof(arr2));
	memset(result, 0, sizeof(result));

	//get函数
	gets(str1);
	gets(str2);

	//计算实际长度
	len1 = strlen(str1);
	//printf("%d\n", len1);
	len2 = strlen(str2);

	//把输入的数列反向转入数组,即最低位在数组的第一个位置[0]
	for(i = len1-1; i >= 0; i--)
	{
		arr1[j++] = str1[i] - '0';
	}
	j = 0;
	for(i = len2-1; i >= 0; i--)
	{
		arr2[j++] = str2[i] - '0';
	}

	//
	for(i = 0; i < len2; i++)
	{
		for(j = 0; j < len1; j++)
		{
			result[i+j] += arr1[i]*arr2[j];
		}
	}

	//进位
	for(i = 0; i < MAX*2; i++)
	{
		if(result[i] >= 10)
		{
			result[i+1] += result[i] / 10;//进十位数
			result[i] %= 10;//保留个位数
		}
	}

	//输出结果(注意输出的时候把数组最后的一连串的0全部去掉)

	for(i = MAX*2; i >= 0; i--)
	{
		if(flag)
		{
			printf("%d", result[i]);
		}
		else if(result[i])
		{
			printf("%d", result[i]);
			flag = 1;
		}
	}
	//
	if(!flag)
		printf("0");
	printf("\n");
	
	return 0;
}

代码:

下面是java的代码,提交之后出错,但是我自己测试的时候是正确的,主要是不清楚http://hero.pongo.cn/这个平台的代码提交格式。
import java.util.Scanner;
/*
	大数相乘
*/
public class Test
{
	public static String getInfo()
	{
		String resultStr = "";
		Scanner scanner = new Scanner(System.in);
		int arr1[] = new int[100];
		int arr2[] = new int[100];
		String s1 = scanner.next();
		String s2 = scanner.next();
		int result[] = new int[200];
		int len1 = 0, len2 = 0, len3 = 0, i, j = 0;
		boolean flag = false;
		
		char str1[] = s1.toCharArray();
		char str2[] = s2.toCharArray();
		
		len1 = s1.length();
		len2 = s2.length();
		for(i = len1 - 1; i >= 0; i--)
		{
			arr1[j++] = str1[i] - '0';
		}
		j = 0;
		for(i = len2 - 1; i >= 0; i--)
		{
			arr2[j++] = str2[i] - '0';
		}
		//
		for(i = 0; i < len2; i++)
		{
			for(j = 0; j < len1; j++)
			{
				result[i+j] += arr1[i]*arr2[j];
			}
		}
		//
		for(i = 0; i < 200; i++)
		{
			if(result[i] >= 10)
			{
				result[i+1] += result[i] / 10;//
				result[i] %= 10;//
			}
		}

		//
		for(i = 200-1; i >= 0; i--)
		{
			if(flag)
			{
				resultStr += result[i]+"";
			}
			else if(result[i] >= 1)
			{
				resultStr += result[i]+"";
				flag = true;
			}
		}
		if(!flag)
		{
			resultStr += "0";
		}
		return resultStr;
	}

	public static void main(String []args)
	{
		System.out.println(getInfo());
	}
}

请指教错误之处!
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页