// 巨大有理数演算プログラム with JavaScript 0.0.3 //
/* 小数点 */
//入力:MathString = 小数点・符号を含む有理数;
//出力:return "小数点を除去した有理数,後ろから数えて小数点のある位置の直前(初期値0)";
function DecimalPoint(Math_String){
// Debug
/*
now = new Date;
var Debug_time = now.getTime();
*/
// Debug
//符号除去,Mark=除去した符号;
if(Math_String.charAt(0)=="-"){
var Math_String_abs = Math_String.substr(1,Math_String.length-1);
var Mark = "-";
}else{
var Math_String_abs = Math_String;
var Mark = "";
}
//小数点位置検索
//演算速度を上げるために小数点の有無をチェック
if(!Math_String_abs.match(/\./)){var Decimal_Point_Position=0;var Math_String_NoPoint=Mark+Math_String_abs;}//存在しない場合
else{
//小数点が存在した場合の位置特定
var Decimal_Point_Position=Math_String_abs.length-1-Math_String_abs.indexOf(".",0);
//小数点除去
var Math_String_NoPoint=Mark+Math_String_abs.replace(/\./,"");
}
//小数点を外した数,小数点の位置を返す
var return_Point_String=Math_String_NoPoint+","+Decimal_Point_Position;
// Debug
/*
now2 = new Date;
Debug_time -= now2.getTime();
return_Point_String+="
Time"+(-Debug_time/1000)+"/s";
*/
// Debug
return return_Point_String;
}
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
/* 加算減算 */
//入力:足し合わせる2数
//出力:足し合わせた結果
function Addition(String_A,String_B){
//小数点関数を利用
var String_A_PointOut_Str = DecimalPoint(String_A);
var String_A_PointOut = String_A_PointOut_Str.split(",")[0];
var String_A_Point = eval(String_A_PointOut_Str.split(",")[1]);
var String_B_PointOut_Str = DecimalPoint(String_B);
var String_B_PointOut = String_B_PointOut_Str.split(",")[0];
var String_B_Point = eval(String_B_PointOut_Str.split(",")[1]);
//桁揃え
if(String_A_PointString_B_Point){
var String_C_Point=String_A_Point;
for(String_B_Point_Plus=0;String_B_Point_Plus String_B_2.length){var String_A_3=String_A_2;var String_B_3=String_B_2;}
if(String_A_2.length < String_B_2.length){var String_A_3=String_B_2;var String_B_3=String_A_2;}
if(String_A_2.length==String_B_2.length){var String_A_3="0"+String_A_2;var String_B_3=String_B_2;}
var Mode="+";
}//A&B +or-
/* A,Bが異符号 */
else{
if(String_B_PointOut.charAt(0)=="-"){var Markx="";var Marky="-";}else{var Markx="-";var Marky="";}//符号設定
//-除去
if(String_A_PointOut.charAt(0)=="-"){
String_A_2=String_A_PointOut.substr(1,String_A_PointOut.length-1);
String_B_2=String_B_PointOut;
}else{
String_B_2=String_B_PointOut.substr(1,String_B_PointOut.length-1);
String_A_2=String_A_PointOut;
}
if(String_A_2.length > String_B_2.length){var Mark=Markx;var String_A_3=String_A_2;var String_B_3=String_B_2;}
if(String_A_2.length < String_B_2.length){var Mark=Marky;var String_A_3=String_B_2;var String_B_3=String_A_2;}
if(String_A_2.length==String_B_2.length){
for(String_A_2_X=0;String_A_2_X eval(String_B_2.charAt(String_A_2_X))){
var Mark=Markx;
String_A_3="0"+String_A_2;
String_B_3=String_B_2;
break;
}
if(String_A_2_X==(String_A_2.length-1)){
var Mark="";
String_A_3="0";
String_B_3="0";
break;
}
}
}
var Mode="-";
}
var Up_String=0;
var String_C_3="";
var String_C_2="";
var String_C=Mark;
//加算
if(Mode=="+"){
for(Mode_Plus=1 ; Mode_Plus<=String_A_3.length ; Mode_Plus++){
if(Mode_Plus>String_B_3.length){
Addition_B=0;
}else{
Addition_B=eval(String_B_3.charAt(String_B_3.length-Mode_Plus));
}
var A_B=Up_String+eval(String_A_3.charAt(String_A_3.length-Mode_Plus))+Addition_B;
if(String(A_B).length==2){
Up_String=1;
String_C_3+=String(eval(A_B)-10);
}else{
Up_String=0;
String_C_3+=String(A_B);
}
}
}
else{
for(Mode_Plus=1 ; Mode_Plus<=String_A_3.length ; Mode_Plus++){
if(Mode_Plus>String_B_3.length){
Addition_B=0;
}else{
Addition_B=eval(String_B_3.charAt(String_B_3.length-Mode_Plus));
}
var A_B=eval(String_A_3.charAt(String_A_3.length-Mode_Plus))-Addition_B-Up_String;
if(String(A_B).length==3){
String_C_3+=String(10+eval(A_B));
Up_String=1;
}
if(String(A_B).length==2){
String_C_3+=String(10+eval(A_B));
Up_String=1;
}
if(String(A_B).length==1){
String_C_3+=String(A_B);
Up_String=0;
}
}
}
String_C_3+=Up_String;
//数列を逆にする
for(String_C_3_SUB=1;String_C_3_SUB<=String_C_3.length;String_C_3_SUB++){
String_C_2+=String_C_3.charAt(String_C_3.length-String_C_3_SUB);
}
//左側の0を除去
z=1;
while(z==1){
if(String_C_2.charAt(0)=="0"){String_C_2=String_C_2.substr(1,String_C_2.length-1);}else{break;}
}
if(String_C_2==""){String_C_2="0";}
//小数点付加
if(String_C_Point!=0){
String_C_2=String_C_2.substr(0,String_C_2.length-String_C_Point)+"."+String_C_2.substr(String_C_2.length-String_C_Point,String_C_Point);
}
//右側の0を除去
z=1;
while(z==1){
if(String_C_2.charAt(String_C_2.length-1)=="0" && String_C_2.match(/\./)){String_C_2=String_C_2.substr(0,String_C_2.length-1);}else{break;}
}
if(String_C_2.charAt(String_C_2.length-1)=="."){String_C_2=String_C_2.substr(0,String_C_2.length-1);}
if(String_C_2==""){String_C_2="0";}
//-+1>で小数点の前に0がない場合
if(String_C_2.substr(0,1)=="-."){String_C_2="-0."+String_C_2.substr(2,String_C_2.length-1);}
if(String_C_2.charAt(0)=="."){String_C_2="0"+String_C_2;}
String_C+=String_C_2;
return String_C;
}
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
/* 掛け算 */
//入力:かけ合わせる2数
//出力:かけ合わせた結果
function Multiplication(String_A,String_B){
//小数点関数を利用
var String_A_PointOut_Str = DecimalPoint(String_A);
var String_A_PointOut = String_A_PointOut_Str.split(",")[0];
var String_A_Point = eval(String_A_PointOut_Str.split(",")[1]);
var String_B_PointOut_Str = DecimalPoint(String_B);
var String_B_PointOut = String_B_PointOut_Str.split(",")[0];
var String_B_Point = eval(String_B_PointOut_Str.split(",")[1]);
//符号除去
if(String_A_PointOut.charAt(0)=="-" && String_B_PointOut.charAt(0)=="-"){
Mark="";
String_A_PointOut=String_A_PointOut.substr(1,String_A_PointOut.length-1);
String_B_PointOut=String_B_PointOut.substr(1,String_B_PointOut.length-1);
}
if(String_A_PointOut.charAt(0)!="-" && String_B_PointOut.charAt(0)=="-"){
Mark="-";
String_B_PointOut=String_B_PointOut.substr(1,String_B_PointOut.length-1);
}
if(String_A_PointOut.charAt(0)=="-" && String_B_PointOut.charAt(0)!="-"){
Mark="-";
String_A_PointOut=String_A_PointOut.substr(1,String_A_PointOut.length-1);
}
if(String_A_PointOut.charAt(0)!="-" && String_B_PointOut.charAt(0)!="-"){
Mark="";
}
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//6桁区切りの計算の最大数
var limitA = Math.ceil(String_A_PointOut.length/6);
var limitB = Math.ceil(String_B_PointOut.length/6);
var AB = "0";
for(A_Loop=0 ; A_Loopで小数点の前に0がない場合
if(AB.substr(0,1)=="-."){AB="-0."+AB.substr(2,AB.length-1);}
if(AB.charAt(0)=="."){AB="0"+AB;}
var String_C=Mark+AB;
return String_C;
}
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
/* 割り算 */
//入力:割られる数,割る数,小数点以下の桁数
//出力:割った結果
function Division(String_A,String_B,Figures){
}
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
/* 累乗 */
//入力:底,乗数
//出力:計算結果
function Involution(String_A,String_B){}