任意长度的两个正整数相乘
题目:
两个大数相乘: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());
}
}
请指教错误之处!