程序流程图(活动图):
算法实现:
public class NumberCalculator
{
public NumberCalculator()
{
}
/**
* 字符串表示大数相乘
* @param firStr -- 第一个大数
* @param secStr -- 第二个大数
* @return 结果字符串
*/
public String getMulNumStr(String firStr,String secStr)
{
String resStr="";
int firLength=firStr.length();
int secLength=secStr.length();
//声明数组
int[] firNum=new int[firLength];
int[] secNum=new int[secLength];
int[] resNum=null;
//字符串转换整形数组.
for ( int firIndex=0;firIndex<firLength;firIndex++)
{
firNum[firIndex]=firStr.charAt(firIndex)-48;
}
for(int secIndex=0;secIndex<secLength;secIndex++)
{
secNum[secIndex]=secStr.charAt(secIndex)-48;
}
//获得结果.
if(firLength>secLength)
{
resNum=getMulNumInt(firNum,secNum);
}
else
{
resNum=getMulNumInt(secNum,firNum);
}
//结果优化.
for ( int resIndex=1;resIndex<resNum.length;resIndex++)
{
resStr+=resNum[resIndex];
}
if(resNum[0]!=0)
{
resStr=resNum[0]+resStr;
}
//返回结果
return resStr;
}
/**
* 正整数大数相乘
* @param firNum -- 第一个大数
* @param secNum -- 第二个大数
* @return -- 结果数组
*/
private int[] getMulNumInt(int[] firNum, int[] secNum)
{
int[] resNum=new int[firNum.length+secNum.length];
int[] midNum=new int[firNum.length+1];
for(int secIndex=secNum.length-1;secIndex>=0;secIndex--)
{
midNum=getMidNum(firNum,secNum[secIndex]);
resNum=getResNum(resNum,midNum,secNum.length-secIndex-1);
}
return resNum;
}
/**
* 结果加中间结果
* @param resNum -- 结果
* @param midNum -- 一个中间结果
* @param shift -- 偏移位数
* @return -- 结果数组
*/
private int[] getResNum(int[] resNum, int[] midNum, int shift)
{
//进位标志
int carry=0;
int midLen=midNum.length;
int midRes=0;
int resLen=resNum.length;
//应该操作结果的操作位
int opeBit=resLen-1-shift;
for(int index=midLen-1;index>=0;index--)
{
midRes=resNum[opeBit]+midNum[index]+carry;
carry=midRes/10;
resNum[opeBit]=midRes%10;
opeBit--;
}
while(carry!=0)
{
midRes=resNum[opeBit]+carry;
resNum[opeBit]=midRes%10;
carry=midRes/10;
opeBit--;
}
return resNum;
}
/**
* 获得一个大数乘一个个位数的结果
* @param firNum -- 大数
* @param number -- 个位数
* @return 结果数组
*/
private int[] getMidNum(int[] firNum, int number)
{
int length=firNum.length;
int[] resNum=new int[length+1];
int carry=0;
int midRes=0;
int shift=resNum.length-1;
for(int index=length-1;index>=0;index--)
{
midRes=firNum[index]*number+carry;
resNum[shift]=midRes%10;
carry=midRes/10;
shift--;
}
resNum[shift]=carry;
return resNum;
}
}
程序调用:
System.out.println("-------------------begin test number----------------------------");
String resNum=new NumberCalculator().getMulNumStr("999999999999999", "9999999999999999");
System.out.println("The result is : "+resNum);
System.out.println("-------------------end test number----------------------------");
结果输出:
-------------------begin test number----------------------------
The result is : 9999999999999989000000000000001
-------------------end test number----------------------------