黑马程序员技术交流社区
标题:
任意长度的两个正整数相乘
[打印本页]
作者:
郭孟涛
时间:
2013-1-29 00:18
标题:
任意长度的两个正整数相乘
本帖最后由 张向辉 于 2013-2-2 11:09 编辑
两个大数相乘:char* multiply(char*,char*)。给了两个字符串,每个都是代表了一个很长的10进制表示的数, 比如 String str1 = "23456789009877666555544444"; String str2 = "346587436598437594375943875943875", 最后求出它们的乘积。 不用jdk的数学运算包BigInteger.或者类似的包。
作者:
李跃达
时间:
2013-1-30 22:29
//首先Char *是C++里的字符串表示方法,Java里我们用String
//思路:模拟手工计算乘法的过程
//先把两个数的字符串逆序 。为什么逆序?方便处理到高位的进位
//然后计算。计算的中间结果存在一个整型数组里。
//最后将整型数组转换成字符串返回
//测试用例用Windows自带的计算器算了一下,证明代码的运行结果完全。
//温馨提示:计算器的操作数和结果可以复制粘贴哦。
//代码匆匆写就,欢迎高手前来优化。
public class x
{
static int N=100;
public static void main(String[] args)
{
String str1 ="23456789009877666555544444";
String str2 ="346587436598437594375943875943875";
System.out.println(multiply(str1,str2));
}
static String multiply(String s1,String s2)
{
int i,j,tmp;
String s=new StringBuffer(s1).reverse().toString();
String t=new StringBuffer(s2).reverse().toString();
int []r=new int[N];
for(i=0;i<s.length();i++)
for(j=0;j<t.length();j++)
{
tmp=(s.charAt(i)-'0')*(t.charAt(j)-'0');
r[i+j]+=tmp%10;
r[i+j+1]+=tmp/10;
}
for(i=0;i<N;i++)
{
tmp=r[i];
if(tmp>9)
{
r[i]=tmp%10;
r[i+1]+=tmp/10;
}
}
StringBuffer sb=new StringBuffer();
for(i=N-1;i>=0;i--)
if(r[i]!=0)
break;
for(j=i;j>=0;j--)
sb.append(r[j]);
return sb.toString();
}
}
复制代码
作者:
郭孟涛
时间:
2013-1-30 22:35
我运行一下,答案这么长:8129828373763903512004369615410968394975299532195012080500
向您学习了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2