<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
<HEAD>
<TITLE>多功能计算器</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<SCRIPT language=JavaScript>
// 最大公约数
function gcd(a, b)
{
while (b)
{
var t = a % b;
a = b;
b = t;
}
return a;
}
// 配平化学方程式
function Balance(s)
{
var A = []; // 系数矩阵
var E = []; // 元素数组
var M = s.match(/.+?(\+|=|$)/g); // 物质数组
var R = /(?:([A-Z][a-z]?)|\))(\d*)|./g; // 分析化学式的正则表达式
// $1 = [A-Z][a-z]? // 元素
// $2 = \d* // 系数
var e, m, a = 0, b = 1, n, t; // 循环及临时变量
for (m = 0; m < M.length; m++)
{
while (t = R.exec(M[m]))
{
if (t[1])
{
for (e = 0; e < E.length; e++)
{
if (t[1] == E[e])
break;
}
if (e == E.length)
{
E.push(t[1]);
A.push([]);
for (n = 0; n < M.length; n++)
A[e].push(0);
}
A[e][m+a] = b * (t[2] ? t[2] : 1);
}
else if (t[2] && a)
{
n = t[2] ? t[2] : 1;
for (e = 0; e < E.length; e++)
{
A[e][m+a-1] += A[e][m+a] * n;
A[e][m+a] = 0;
}
a--;
}
else if (t[0] == "(")
{
a++;
}
else if (t[0] == "=" && b == 1)
{
b = -1;
}
else if (t[0] != "+")
return "输入错误: 非法字符\""+t[0]+"\"";
}
if (a > 0)
return "输入错误: 缺少\")\"";
}
if (b == 1)
return "输入错误: 缺少\"=\"";
if (E.length + 1 < M.length)
return "无解: 过少元素或过多物质";
for (m = 0; m < M.length - 1; m++) // 每一物质
{
if (A[m][m] == 0)
{
for (e = m + 1; e < E.length; e++) // 选取主行
{
if (A[e][m])
{
t = A[m];
A[m] = A[e];
A[e] = t;
break;
}
}
if (e == E.length)
return "无解: 过少线性无关";
}
for (e = m + 1; e < E.length; e++) // 每一元素
{
if (A[e][m])
{
n = gcd(A[e][m], A[m][m]); // 通分
a = A[e][m] / n, b = A[m][m] / n;
for (n = m; n < M.length; n++) // 每一元素的后续项
A[e][n] = A[e][n] * b - A[m][n] * a; // 消元
}
}
}
for (e = M.length - 1; e < E.length; e++) // 多余方程如果是线性相关的就消掉了, 消不掉则无解.
{
if (A[e][M.length-1])
return "无解: 过多线性无关";
}
t = 1; // 最小公倍数
for (m = M.length - 2; m >= 0; m--)
{
for (e = 0; e < m ; e++)
{
n = gcd(A[e][m], A[m][m]); // 通分
a = A[e][m] / n, b = A[m][m] / n;
for (n = 0; n < M.length; n++)
A[e][n] = A[e][n] * b - A[m][n] * a; // 回代
}
n = A[m][m] / gcd(A[m][m], A[m][M.length-1]);
t *= n / gcd(t, n);
}
t = Math.abs(t);
for (m = 0; m < M.length - 1; m++) // 通分
{
n = -t * A[m][M.length-1] / A[m][m];
if (n != 1)
M[m] = n + M[m];
}
if (t != 1)
M[M.length-1] = t + M[M.length-1];
return M.join("");
}
// 解二次方程
function Quadratic(s)
{
var A = s.split(/[\s,]+/);
if (A.length != 3)
return "输入错误";
var a = parseFloat(A[0]);
var b = parseFloat(A[1]);
var c = parseFloat(A[2]);
var d = b * b - 4 * a * c;
if (d > 0)
return (-b + Math.sqrt(d)) / (2 * a) + ", " + (-b - Math.sqrt(d)) / (2 * a);
if (d == 0)
return -b / (2 * a);
else
return "无解";
}
</SCRIPT>
</HEAD>
<BODY>
<CENTER>
<H2>多功能计算器</H2>
<HR color=red>
<P><INPUT style="WIDTH: 96%" name=input></INPUT></P>
<P><INPUT style="WIDTH: 96%" name=output></INPUT></P>
<P><BUTTON οnclick=with(Math)output.value=eval(input.value)>计算表达式</BUTTON>
<BUTTON οnclick=output.value=Quadratic(input.value)>解二次方程</BUTTON>
<BUTTON οnclick=output.value=Balance(input.value)>配平化学方程式</BUTTON></P>
<HR color=green>
<P>作者:杨文淳 QQ:1583755995 Email:YangC9@126.com</P>
</CENTER>
</BODY>
</HTML>
Javascript多功能计算器
最新推荐文章于 2024-08-04 15:22:29 发布