// 巨大有理数演算プログラム 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){}