本方法的思路为:

  一:检查了输入的合法性(非空,无非法字符)

  二:检查输入是否可以进行简单计算(一个数为 0,1,+1,-1)

  三:去掉输入最前面可能有的正负符号,并判断输出的正负

  四:将输入的值分成4位一截(分的长度太短,性能太差,长度太长,精度容易降低)

  五:遍历相乘得到最终数组(这里用了递归)

  六:遍历最终数组,拼接最终的数(不建议用join,因为数组中的元素可能小于四位,拼接时会丢失0)

  七:将正负符号与最终的数拼接输出

代码如下:

<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript">
var num1 = "";
var num2 = "";
var finallyArr;
/*
* 有两个用字符表示的非常大的大整数,算出他们的乘积,也是用字符串表示,不能用系统自带的大整数类型。
* 输入例子72106547548473106236 982161082972751393
* 输出例子70820244829634538040848656466105986748
70820244829634538040848656466105986748
*/
function getResult(){
finallyArr = new Array();
num1 = document.getElementById("num1").value;
num2 = document.getElementById("num2").value;
if(!checkNum(num1)){
alert("输入:num1 不合法!");
return;
}
if(!checkNum(num2)){
alert("输入:num2 不合法!");
return;
}
//特殊情况的简单算法
if(doSimpleWay()){
return;
} //获取最终值的正负符号
var symbol = initSymbol(); //将输入的值分成4位一小截的数组
var numArr1 = getNumArr(num1,new Array());
var numArr2 = getNumArr(num2,new Array()); //遍历相乘相加得到最终的数组
for(var i = 0; i < numArr1.length; i++){
for(var j = 0; j < numArr2.length; j++){
updateFinallyArr(i + j , numArr1[i] * numArr2[j]);
}
}
//倒序遍历数组获取最终结果
var resultStr = finallyArr.pop();
for(var i = finallyArr.length; i >= 0; i--){
if(finallyArr[i] >= 1000){
resultStr += "" + finallyArr[i];
}else if(finallyArr[i] < 1000){
resultStr += "0" + finallyArr[i];
}else if(finallyArr[i] < 100){
resultStr += "00" + finallyArr[i];
}else if(finallyArr[i] < 10){
resultStr += "000" + finallyArr[i];
}else if(finallyArr[i] == 0){
resultStr += "0000";
}
}
document.getElementById("RESULT").innerText = symbol + resultStr;
} /**
* 根据数值以及数值的位置更新最终的数组
*/
function updateFinallyArr(i , num){
var old = finallyArr[i];
if(old){
num = num + old;
}
if(num > 9999){
finallyArr[i] = num % 10000;
updateFinallyArr(i + 1 , Math.floor(num/10000) );
}else{
finallyArr[i] = num;
} } /**
* 处理输入字符串的正负号,并判断最终值的正负号
*/
function initSymbol(){
if(num1.substring(0,1) == "-"){
num1 = num1.substring(1,num1.length);
if(num2.substring(0,1) == "-"){
num2 = num2.substring(1,num2.length);
}else if(num2.substring(0,1) == "+"){
num2 = num2.substring(1,num2.length);
return "-";
}else{
return "-";
}
}else if(num1.substring(0,1) == "+"){
num1 = num1.substring(1,num1.length);
if(num2.substring(0,1) == "-"){
num2 = num2.substring(1,num2.length);
return "-";
}else if(num2.substring(0,1) == "+"){
num2 = num2.substring(1,num2.length);
}
}
return "";
} /**
* 特殊情况的简单算法
*/
function doSimpleWay(){
if(num1 == "0" || num2 == "0"){
document.getElementById("RESULT").innerText = "0";
return true;
}else if(num1 == "1" || num1 == "+1"){
document.getElementById("RESULT").innerText = num2;
return true;
}else if(num2 == "1" || num2 == "+1"){
document.getElementById("RESULT").innerText = num1;
return true;
}else if(num1 == "-1"){
if(num2.substring(0,1) == "-" ){
document.getElementById("RESULT").innerText = num2.substring(1,num2.length);
}else if(num2.substring(0,1) == "+" ){
document.getElementById("RESULT").innerText = "-" + num2.substring(1,num2.length);
}else{
document.getElementById("RESULT").innerText = "-" + num2;
}
return true;
}else if(num2 == "-1"){
if(num1.substring(0,1) == "-" ){
document.getElementById("RESULT").innerText = num1.substring(1,num1.length);
}else if(num1.substring(0,1) == "+" ){
document.getElementById("RESULT").innerText = "-" + num1.substring(1,num1.length);
}else{
document.getElementById("RESULT").innerText = "-" + num1;
}
return true;
}
return false;
} /**
* 获取4位一小截的数组
*/
function getNumArr(num,arr){
var len = num.length;
if(len > 4){
arr.push(num.substring(len-4,len) * 1);
num = num.substring(0,len-4);
return getNumArr(num,arr);
}else{
arr.push(num * 1);
return arr;
}
} /**
* 检查输入数字的正确性,非空、无不合法字符
*/
function checkNum(num){
if(!num){
return false;
}
var str = num.replace(/[0-9]/g,"");
if(str == "" || (str == "-" && num.substring(0,1) =="-" && num.length > 1)
|| (str == "+" && num.substring(0,1) =="+" && num.length > 1) ){
if(num.length > 1000){
return false;
}
return true;
}else{
return false;
}
}
</script>
</head>
<body>
num1:<input type="text" id="num1" name=""
    value="7210654754847310623672106547548473106236721065475484731062367210654754847310623672106547548473106236" style="width:80%"></br>
num2:<input type="text" id="num2" name=""
    value="9821610829727513939821610829727513939821610829727513939821610829727513939821610829727513939821610829" style="width:80%"></br>
<input type="button" id="num2" value="计算" onclick="getResult()"></br>
<textarea id = "RESULT" rows="5" style="width:80%"></textarea>
</body>
</html>
 

最新文章

  1. nrm NPM源管理工具
  2. Sublime Text 基础配置
  3. Linux 命令快捷键
  4. 处理字符串-String类和正则表达式
  5. apk反编译生成程序的源代码和图片、XML配置、语言资源等文件
  6. hibernate中有时候复杂删除有时候可以拆分为两个语句
  7. 1_HelloWorld
  8. Android分享功能实现
  9. openssl命令行将pfx格式转.key和.crt文件,Apache适用
  10. 好好耕耘 redis和memcached的区别
  11. poj 1486 纸张与数字匹配(二分图+割边处理)
  12. vue.js+SSH添加和查询
  13. vtiger7菜单管理
  14. Oracle 未能加载文件或程序集Oracle.DataAccess
  15. slot 插槽的使用
  16. 20155339平措卓玛 Exp1 PC平台逆向破解(5)M
  17. PHP定界符出现错误
  18. Python之路番外:PYTHON基本数据类型和小知识点
  19. sql server数据库打不开
  20. TLS and SSL

热门文章

  1. Bamboo基础概念
  2. FAT32文件系统学习(上)
  3. BDD数据集(mask_rcnn)1
  4. L2-025. 分而治之
  5. Python爬虫(二)——对开封市58同城出租房数据进行分析
  6. mybatis插入数据并返回主键(oracle)
  7. pandas之时间序列
  8. Learning-Python【补充篇】:Python之可变类型与不可变类型
  9. 深度学习环境搭建:Tensorflow1.4.0+Ubuntu16.04+Python3.5+Cuda8.0+Cudnn6.0
  10. ios外派公司—提供ios程序员外派ios应用外包业务(北京动点 可签合同)