1. find_pw.php
<form name=find_pw action=decrypt.php method=post>
<table border=0 width=250>
<tr>
<td colspan=2 align=center>패스워드 찾기</td>
</tr>
<tr>
<td colspan=2></td>
</tr>
<tr>
<td colspan=2 height=10></td>
</tr>
<tr>
<td align=right>ID </td>
<td><input type=text name=user_id size=20 maxlength=20 class=input></td>
</tr>
<tr>
<td align=right>email </td>
<td><input type=text name=email size=20 maxlength=30 class=input></td>
</tr>
<tr height=30>
<td align=center align=center colspan=2 >
<br>
<input type=submit value="Ok~!">
<input type=button value="reset" onclick=reset() class=kissofgod-submit>
</td>
</tr>
<tr>
<td colspan=2 class=kissofgod-base-line></td>
</tr>
</table>
2. decrypt.php
이 파일은 lib이나 따로 스크립트를 include하지 않고 자체 처리한다. config.php만 db정보를 얻기 위해 사용한다.
id와 email로 pw를 복호화 한다.
<?
function dbconn() {
global $connect, $config_dir, $autologin, $HTTP_COOKIE_VARS, $_dbconn_is_included;
if($_dbconn_is_included) return;
$_dbconn_is_included = true;
$f=@file($config_dir."config.php") or mysql_error();
for($i=1;$i<=4;$i++) $f[$i]=trim(str_replace("n","",$f[$i]));
if(!$connect) $connect = @mysql_connect($f[1],$f[2],$f[3]) or mysql_error();
@mysql_select_db($f[4], $connect) or mysql_error();
return $connect;
}
$connect=dbConn();
$result=mysql_select_db($dbname, $connect);
$encrr = mysql_fetch_array(mysql_query("select password from zetyx_member_table where user_id='$user_id' and email='$email'")) or mysql_error();
// echo $encrr[0]; 암호 확인
?>
<body onload="decrypt('<?=$encrr[0]?>')">
<script>
function decrypt(password)
{
//alert(decriptText);
// ========= RSA 복호화 방법 ========= //
<!-- =========== 걸린 시간 측정하기 ====================== -->
var today = new Date() // 현재시간 얻기
var startTime = today.getTime(); // 밀리초 from 1/1/70
<!-- =================================================== -->
var clearText = password;
var prime1 = parseFloat(991); // 입력 숫자문자p를 숫자로 바꿈
var prime2 = parseFloat(919); // 입력 숫자문자q를 숫자로 바꿈
var epublic = parseFloat(46421);// 입력 숫자문자d(비밀키)를 숫자로 바꿈
var block = parseFloat(5); // 입력 숫자문자(블럭당 문자수)를 숫자로 바꿈
var clearTextBang= clearText.split(" "); // 암호문을 분리함.
var lengTextBang = clearTextBang.length; // 암호문의 갯수
var pp0 =prime1; // p값
var qq0 =prime2; // q값
var ee0 =epublic; // e값
var pq = prime1*prime2
var pipq = (prime1-1)*(prime2-1)
<!-- ======= 공약수, 역원 구하기========-->
var gcded=pipq;
var p2=epublic;
var x1=1; var y1=0 // 유클리트 알고리즘
var x2=0; var y2=1 // 유클리트 알고리즘
var ii=0;
while(p2!=0)
{var r1 = (gcded%p2); // (p-1)(q-1)과 e의 공약수 구하기
var quot1 = Math.floor(gcded/p2); // 몫
<!-- ======= 유클리트 알고리즘으로 역원 구하기========-->
if(ii%2 ==0)
{//x1-=(x2*quot1); // pipq와 곱하는 값
y1-=(y2*quot1); } // epublic와 곱하는 값
else{//x2-=(x1*quot1); // pipq와 곱하는 값
y2-=(y1*quot1);}; // epublic와 곱하는 값
ii++;
gcded=p2; // 최종 gcded이 공약수
p2=r1;
};
var gcdPhipqe=gcded; // (e, pipq)=공약수
if(gcded ==1){det1 = "입니다." // 서로소 판정
}else{det1 = "가 아님! 다른 수를!"
};
if(ii%2 ==0){// xx=x1;
dd=y1
}else{// xx=x2;
dd=y2
}; // 비밀키 dd=epublic의 역원(mod pipq) 최종 결과
if(dd<0){dd+=pipq}; //양수로 만들기
<!-- ================================================ -->
<!-- ======== 평문을 RSA암호문으로 바꾸기 =========== -->
<!-- ======== 문자를 Ascii codes(숫자)로 바꾸기 ===== -->
<!-- ================================================ -->
<!-- ======== 지수 계산 =========== -->
var edigits= Math.floor(Math.log(epublic)/Math.log(2)); // 2^e 의 자리수
//var ddigits= Math.floor(Math.log(dd)/Math.log(2)); // 2^dd 의 자리수
var ee1 = new Array(edigits+1); // 복호화 준비
//var dd1 = new Array(ddigits+1); // 복호화 준비
var ee2=epublic;
for (jj=edigits; jj>-1; jj--) // 복호화 준비learTextBang[i]^dd(mod pq) 계산시 사용
{ee1[jj]=Math.floor(ee2/Math.pow(2,jj));
ee2-=Math.pow(2,jj)*ee1[jj]; } //이민섭 암호학 p.320 참조
<!-- ===================================== -->
<!-- ============ 복호화 계산 ============== -->
<!-- ===================================== -->
var cipher =""; // 복호문 숫자 선언
var cipherOut =""; // 출력용 복호문 숫자 선언
var cipher2 = new Array(lengTextBang); // 암호화 방
var decript = ""; // 숫자 복호화 방
var decriptText = ""; // 문자 복호화 방
for (i=0; i<lengTextBang; i++){ // 복호 숫자 구하기
clearTextBang[i] -= 0; // 정수 문자열을 숫자열로 바꿈
cipher2[i]=1;
for (jj=edigits; jj>-1; jj--){ // 암호화 clearTextBang[i]^d(mod pq)
// cipher2[i] =(Math.pow(cipher2[i],2)*Math.pow(clearTextBang[i],ee1[jj]))%pq; // 암호숫자를 복호숫자로
cipher2[i] =Number( MathRemainder(Multiple(MathPow(String(cipher2[i]),"2"),
MathPow(String(clearTextBang[i]),String(ee1[jj])) ) ,String(pq) )); // 암호숫자를 복호숫자로
};
xleng = String(cipher2[i]).length;
if(xleng < block){ // 자리수 block보다 작으면 block와 같게 하기
for (var j=0; j<(block-xleng); j++){
cipher2[i] = "0"+cipher2[i];
}
};
cipherOut+= cipher2[i] + " "; // 복호 숫자 출력
cipher += cipher2[i];
};
for (j=0;j<cipher.length+1;j+=2){
decript+= cipher.substring(j,j+2)+" ";// 2자리씩 잘라 숫자를 잇기
decriptText+= String.fromCharCode(parseInt(cipher.substring(j,j+2))+32);// 2자리씩 잘라 숫자를 아스키 문자로 대응
}
<!-- =========== 걸린 시간 측정하기 ====================== -->
var today0 = new Date()
var lastTime0 = today0.getTime(); // 밀리초 from 1/1/70
time = (lastTime0 - startTime)/1000; // 연산하는데 걸린 시간.
<!-- =================================================== -->
decriptText = trim(decriptText);
if(decriptText)
{
alert("당신의 패스워드는 [" + decriptText + "] 입니다.");
self.close();
}
else
{
alert("정보가 없습니다");
history.go(-1);
}
return;
}
function trim(s) {
s += ''; // 숫자라도 문자열로 변환
return s.replace(/^s*|s*$/g, '');
}
<!--
//=======================================================//
// 양측의 필요없는 문자 없애기 프로그램
//=======================================================//
function Trim(st,xx){ // 문자열(st)에서 좌우측 필요 없는 문자(xx) 없애기
while(st.indexOf(xx)==0) st=st.substring(1);// 좌측의 필요없는 0 없애기
while(st.lastIndexOf(xx)==st.length-1) st=st.substring(0,st.length-1);// 우측의 필요없는 0 없애기
return st
}
//=======================================================//
// 좌측의 필요없는 문자 없애기 프로그램
//=======================================================//
function TrimLeft(st,xx){ // 문자열(st)에서 좌측 필요 없는 문자(xx) 없애기
while(st.indexOf(xx)==0) st=st.substring(1);// 좌측의 필요없는 0 없애기(0이 있으면 8진법으로 계산됨)
return st
};
//=======================================================//
// 우측의 필요없는 문자 없애기 프로그램
//=======================================================//
function TrimRight(st,xx){ // 문자열(st)에서 좌측 필요 없는 문자(xx) 없애기
while(st.lastIndexOf(xx)==st.length-1) st=st.substring(0,st.length-1);// 우측의 필요없는 0 없애기
return st
};
//=======================================================//
// 양수끼리 더하기 프로그램
//=======================================================//
function AdditionPlus(a,b){
a = TrimLeft(a,"0");
if ( a == ""){a = "0"};
b = TrimLeft(b,"0");
if ( b == ""){b = "0"};
var abMaxlength = Math.max(a.length, b.length);
var quotA = Math.floor(a.length/15)+1; // 15자리씩 나눔 2^51 이하의 수로 계산
var quotB = Math.floor(b.length/15)+1; // 15자리씩 나눔 2^51 이하의 수로 계산
var aRemainder = a.length%15; // 15로 나눈 나머지
var bRemainder = b.length%15; // 15로 나눈 나머지
var quot = Math.max(quotA, quotB);
var aa = new Array(quot);
var bb = new Array(quot);
// ===== 방 배치 시작 ===========================================
for (var i=0;i<quotA-1;i++){
aa[i] = TrimLeft(a.substr(15*(quotA-i-2)+aRemainder,15),"0"); // 좌측 0 제거(0이 있으면 8진법으로 계산됨)
if (aa[i] == ""){
aa[i] = 0;
}else{
aa[i] = parseInt(aa[i]);
};
}; // a의 방배치
if (aRemainder == 0){ // 자리수가 15의 배수인 경우
aa[quotA-1] = 0
}else{
aa[quotA-1] = parseInt(a.substr(0,aRemainder))
};
for (var i=0;i<quotB-1;i++){
bb[i] = TrimLeft(b.substr(15*(quotB-i-2)+bRemainder,15),"0"); // 좌측 0 제거(0이 있으면 8진법으로 계산됨)
if (bb[i] == ""){
bb[i] = 0;
}else{
bb[i] = parseInt(bb[i]);
};
}; // b의 방배치
if (bRemainder == 0){ // 자리수가 15의 배수인 경우
bb[quotB-1] = 0
}else{
bb[quotB-1] = parseInt(b.substr(0,bRemainder))
};
// ===== 방 배치 완료 ===========================================
var aADDb = new Array(quot+1); // 더하는 방 번호
for (i=0;i<=quot;i++){ // 초기화
aADDb[i]="";
if (aa[i] == null){aa[i]=0};
if (bb[i] == null){bb[i]=0};
};
for (i=0;i<quot-1;i++){
if ( (aa[i] + bb[i] +aADDb[i]) <1000000000000000){
aADDb[i] +=aa[i] + bb[i] ;
}else{ // 1000000000보다 크면 다음 자리에 1 더하기
aADDb[i]= (aa[i] + bb[i] + aADDb[i])-1000000000000000;
aADDb[i+1]= 1 ;
};
if (String(aADDb[i]).length <15){ // 15자리가 안되면 0으로 채우기
var k = 15-String(aADDb[i]).length; // 모자란 자리수
for(j=0;j<k;j++){
aADDb[i] = "0"+aADDb[i] ;
};
}
};
aADDb[quot-1]= aa[quot-1] + bb[quot-1] + aADDb[quot-1]; // 마지막 블럭 연산
//document.write("a + b = "+(parseInt(a)+ parseInt(b))+"<p>"); // 컴퓨터 계산
//document.write("최종합 = "+aADDb.reverse().join("")+"<p>"); //최종합 결과
return aADDb.reverse().join(""); //최종합 결과
}
//-->
//=======================================================//
// 양수끼리 빼기 프로그램
//=======================================================//
function SubtractPlus(a,b){
a = TrimLeft(a,"0");
if ( a == ""){a = "0"};
b = TrimLeft(b,"0");
if ( b == ""){b = "0"};
///========== 큰 수를 a로 놓기 =================
var a0 = a; // 큰 수 고르기
var b0 = b; // 큰 수 고르기
var sign="";// 음수 처리 준비
if ( a.length == b.length ){ // a,b의 길이가 같은 경우
var j=0;
do{
if (Number(a.substr(j,1)) < Number(b.substr(j,1))){ // b가 큰 경우
a0 = b; // 큰 수 고르기
b0 = a; // 큰 수 고르기
sign="-";
break
}else if (Number(a.substr(j,1)) > Number(b.substr(j,1))){ // a가 큰 경우
break
}else { // a, b가 같은 경우
j+=1
}
}while( a.substr(j-1,1) == b.substr(j-1,1) && j < b.length);
}else if ( a.length < b.length ){ // b가 길은 경우
a0 = b; // 큰 수 고르기
b0 = a; // 큰 수 고르기
sign="-";
}
///========== 큰 수를 a로 놓기 =================
a = a0;
b = b0;
var abMaxlength = Math.max(a.length, b.length);
var quotA = Math.floor(a.length/15)+1; // 15자리씩 나눔 2^51 이하의 수로 계산
var quotB = Math.floor(b.length/15)+1; // 15자리씩 나눔 2^51 이하의 수로 계산
var aRemainder = a.length%15; // 15로 나눈 나머지
var bRemainder = b.length%15; // 15로 나눈 나머지
var quot = Math.max(quotA, quotB);
var aa = new Array(quot); // 15자리로 나눈 후 a의 방배치
var bb = new Array(quot); // 15자리로 나눈 후 b의 방배치
// ===== 방 배치 시작 ===========================================
for (var i=0;i<quotA-1;i++){
aa[i] = TrimLeft(a.substr(15*(quotA-i-2)+aRemainder,15),"0"); // 좌측 0 제거(0이 있으면 8진법으로 계산됨)
if (aa[i] == ""){
aa[i] = 0;
}else{
aa[i] = parseInt(aa[i]);
};
}; // a의 방배치
if (aRemainder == 0){ // 자리수가 15의 배수인 경우
aa[quotA-1] = 0
}else{
aa[quotA-1] = parseInt(a.substr(0,aRemainder))
};
for (var i=0;i<quotB-1;i++){
bb[i] = TrimLeft(b.substr(15*(quotB-i-2)+bRemainder,15),"0"); // 좌측 0 제거(0이 있으면 8진법으로 계산됨)
if (bb[i] == ""){
bb[i] = 0;
}else{
bb[i] = parseInt(bb[i]);
};
}; // b의 방배치
if (bRemainder == 0){ // 자리수가 15의 배수인 경우
bb[quotB-1] = 0
}else{
bb[quotB-1] = parseInt(b.substr(0,bRemainder))
};
// ===== 방 배치 완료 ===========================================
var aADDb = new Array(quot+1); // 빼는 방 번호
for (i=0;i<=quot;i++){ // 초기화
aADDb[i]="";
if (aa[i] == null){aa[i]=0};
if (bb[i] == null){bb[i]=0};
}
for (var i=0;i<quot-1;i++){
if ( (aa[i] - bb[i] -aADDb[i]) <0){ // 음수 처리
aADDb[i] = aa[i] - bb[i] -aADDb[i] +1000000000000000;
aa[i+1] -= 1 ;
}else{ // 0보다 작으면 앞 자리에서 1 가져오기
aADDb[i]= (aa[i] - bb[i] - aADDb[i]);
};
if (String(aADDb[i]).length <15){ // 15자리가 안되면 0으로 채우기
var k = 15-String(aADDb[i]).length; // 모자란 자리수
for(j=0;j<k;j++){
aADDb[i] = "0"+aADDb[i] ;
};
}
}
aADDb[quot-1]= aa[quot-1] - bb[quot-1] - aADDb[quot-1];
var lastResult = sign+TrimLeft(aADDb.reverse().join(""),"0"); // 마지막 빼기 결과 좌측 0 제거
return lastResult; //최종빼기 결과(부호 붙임)
}
<!--
//=======================================================//
///////////////////////////////////////////////
//////// 양수, 음수가 있는 더하기 프로그램 ////////
///////////////////////////////////////////////
//=======================================================//
function Addition(a,b){
a = TrimLeft(a,"0");
if ( a == ""){a = "0"};
b = TrimLeft(b,"0");
if ( b == ""){b = "0"};
var last = ""; // 최종 결과
if (a.substr(0,1) == "-" && b.substr(0,1) != "-" ){ // a가 음수, b가 양수인 경우
last = SubtractPlus(b, a.substring(1))
}else if(a.substr(0,1) != "-" && b.substr(0,1) == "-" ){// a가 양수, b가 음수인 경우
last = SubtractPlus(a, b.substring(1))
}else if(a.substr(0,1) == "-" && b.substr(0,1) == "-" ){// a가 음수, b가 음수인 경우
last = "-"+AdditionPlus(a.substring(1), b.substring(1))
}else{ // a가 양수, b가 양수인 경우
last = AdditionPlus(a, b)
}
return last; //최종합 결과
}
//-->
<!--
//=======================================================//
///////////////////////////////////////////////
//////// 양수, 음수가 있는 빼기 프로그램 /////////
///////////////////////////////////////////////
//=======================================================//
function Subtract(a,b){
a = TrimLeft(a,"0");
if ( a == ""){a = "0"};
b = TrimLeft(b,"0");
if ( b == ""){b = "0"};
var last = "";
if (b.substr(0,1) == "-"){ // b가 음수인 경우
last = Addition(a, b.substring(1))
}else{ // b가 양수인 경우
last = Addition(a, "-"+b)
}
return last; //최종합 결과
}
//-->
//=======================================================//
//////// 양수 곱하기 프로그램 /////////
//=======================================================//
function MultiplePlus(a,b){ // ==== 곱하기 연산 ===
a = TrimLeft(a,"0");
if ( a == ""){a = "0"};
b = TrimLeft(b,"0");
if ( b == ""){b = "0"};
var abMaxlength = Math.max(a.length, b.length);
var quotA = Math.floor(a.length/15)+1; // 15자리씩 나눔 2^51 이하의 수로 계산
var aRemainder = a.length%15; // 15로 나눈 나머지
var quot = Math.max(quotA, b.length);
var aa = new Array(quotA+1);
var bb = new Array(b.length);
// ===== 방 배치 시작 ===========================================
for (var i=0;i<quotA-1;i++){
aa[i] = TrimLeft(a.substr(15*(quotA-i-2)+aRemainder,15),"0"); // 좌측 0 제거(0이 있으면 8진법으로 계산됨)
if (aa[i] == ""){
aa[i] = 0;
}else{
aa[i] = parseInt(aa[i]);
};
}; // a의 방배치
if (aRemainder == 0){ // 자리수가 15의 배수인 경우
aa[quotA-1] = 0
}else{
aa[quotA-1] = parseInt(a.substr(0,aRemainder))
};
for (var i=0;i<b.length;i++){
bb[i] = parseInt(b.substr(i,1));
}; // b의 방배치
bb = bb.reverse();// 순서 반대로 함
// ===== 방 배치 완료 ===========================================
var aADDb = new Array(b.length); // 곱하는 방 번호
var aMULTb = new Array(b.length); // 곱하는 방 번호
<!-- ========================================================== -->
<!-- ========= 2중 배열(aADDb[i][j]) 만들기 ===================== -->
<!-- ========================================================== -->
for (i=0;i<(b.length+1);i++){ // 2중 배열(aADDb[b.length][j]) 만들기 준비
aADDb[i]=""; // 초기화
aMULTb[i]=""; // 초기화 ==> 2중 배열 만들때는 필요 없음.
for (j=0;j<(quotA+1);j++){
aADDb[i]+=" "; // 2중 배열 만들기 준비.
};
aADDb[i]=aADDb[i].split(' '); // 2중 배열(aADDb[b.length][a.length]) 만들기
}
<!-- ========================================================== -->
<!-- ========= 2중 배열(aADDb[i][j]) 만들기 끝 ================== -->
<!-- ========================================================== -->
var digit=""; // 10^n 자리수 맞추기
for (i=0;i<b.length;i++){
for (j=0;j<quotA-1;j++){
if ( (bb[i]*aa[j] + aADDb[i][j]) < 1000000000000000){
aADDb[i][j] += bb[i]*aa[j];
}else{ // 1000000000보다 크면 다음 자리에 1000000000자리수 더하기
aADDb[i][j+1]= Math.floor((bb[i]*aa[j] + aADDb[i][j])/1000000000000000) ; // 10^16자리수
aADDb[i][j] = (bb[i]*aa[j] + aADDb[i][j]) - aADDb[i][j+1]*1000000000000000;// 1자리수
};
if (String(aADDb[i][j]).length <15){ // 15자리가 안되면 0으로 채우기
var k = 15-String(aADDb[i][j]).length; // 모자란 자리수
for(var jj=0;jj<k;jj++){
aADDb[i][j] = "0"+aADDb[i][j] ;
};
};
aMULTb[i] = aADDb[i][j]+aMULTb[i]; // 한 자리수 곱하기 결과 (분할한 것 합치기)
};
aADDb[i][quotA-1] = bb[i]*aa[quotA-1] + aADDb[i][quotA-1]; // 마지막 단계 따로 계산
aMULTb[i] = aADDb[i][quotA-1]+aMULTb[i]; // 한 자리수 곱하기 결과 (분할한 것 합치기)
aMULTb[i] += digit; // 자리수 맞추기
digit +="0";
}
var abmultiple="0"; //최종 곱 구하기: 덧셈연산에 대입하기
for (var i=0;i<b.length;i++){
abmultiple = AdditionPlus(abmultiple,aMULTb[i]); // 문자숫자로 더하기
}
var last = TrimLeft(abmultiple,"0"); ////최종곱 결과
return last; //최종곱 결과
}
//=======================================================//
///////////////////////////////////////////////
//////// 양수, 음수가 있는 곱하기 프로그램 /////////
///////////////////////////////////////////////
//=======================================================//
function Multiple(a,b){
a = TrimLeft(a,"0");
if ( a == ""){a = "0"};
b = TrimLeft(b,"0");
if ( b == ""){b = "0"};
var last = ""; // 최종 결과
if (a.substr(0,1) == "-" && b.substr(0,1) != "-" ){ // a가 음수, b가 양수인 경우
last = "-"+MultiplePlus(a.substring(1), b)
}else if(a.substr(0,1) != "-" && b.substr(0,1) == "-" ){// a가 양수, b가 음수인 경우
last = "-"+MultiplePlus(a, b.substring(1))
}else if(a.substr(0,1) == "-" && b.substr(0,1) == "-" ){// a가 음수, b가 음수인 경우
last = MultiplePlus(a.substring(1), b.substring(1))
}else{ // a가 양수, b가 양수인 경우
last = MultiplePlus(a, b)
}
return last; //최종합 결과
}
//=======================================================//
//////// 양수 나누기 프로그램 /////////
//=======================================================//
function DivisionPlus(a,b){ // ==== 나누기 연산 ===
a = TrimLeft(a,"0");
if ( a == ""){a = "0"};
b = TrimLeft(b,"0");
if ( b == ""){b = "0"};
var digit = 5; // 소수점 5 이하 자리수(숫자로 바꿈)
// var digit0 = digit; // 출력용
if (digit == ""){ ; //입력이 없으면 소수점이하 10자리로 계산
if (a.length-b.length <1){
digit = 11;
}else{
digit = (a.length-b.length+11)
}
}else{
if (a.length-b.length <1){
digit += 1;
}else{
digit += (a.length-b.length+1)
}
}
var quotient = new Array();
var remainder = new Array();
remainder[0] = a.substr(0,b.length); // b의 길이 만큼씩 잘라 나누기 해야함.
quotient[0] = 0 ; //초기화
lastQuotient = "0"; // 최종 몫
for (var j = 0 ; j<digit ; j++){ // 소수점 이하 digit자리까지 계산하는 알고리즘
remainder[j] = TrimLeft(remainder[j],"0"); // 왼쪽의 0 제거(8진법으로 인식 방지)
if(remainder[j] == ""){remainder[j] = "0"}; // 자리수 나누기에서 오류 보정
while (remainder[j].substr(0, 1) != "-" ){ // 각 단계별 몫 구하기
remainder[j] = TrimLeft(SubtractPlus(remainder[j], b),"0");// 왼쪽의 0 제거(8진법으로 인식 방지)
quotient[j] += 1 ;
if(remainder[j] == ""){
remainder[j] = "0";
quotient[j] += 1 ;
break;
}; // 자리수 나누기에서 오류 보정
}
quotient[j+1] = 0 ;
if (j > a.length-b.length-1){ // a의 길이 만큼 나누기를 한 경우 몫을 0으로 채우기
var jj = "0";
}else{
jj= a.substr(j+b.length,1) // 피젯수가 b의 길이보다 큰 경우 a에서 하나씩 가져옴
};
if (remainder[j] == "0"){
remainder[j+1] = TrimLeft(remainder[j]+jj,"0");// 왼쪽의 0 제거(8진법으로 인식 방지)
}else{
remainder[j+1] = TrimLeft(Addition(remainder[j], b)+jj,"0");// 왼쪽의 0 제거(8진법으로 인식 방지)
};
if (a.length-b.length <-1 && j==0){ // 완성된 것임
lastQuotient += "."; // 소수점 인식하기
}else if(a.length-b.length <-1 && j>0){
lastQuotient += (quotient[j]-1); // 소수점 인식하기
}else if(a.length-b.length == -1 && j == 0){
lastQuotient +="."; // 소수점 인식하기
}else if(a.length-b.length == -1 && j > 0){
lastQuotient += (quotient[j]-1); // 소수점 인식하기
}else if(j == a.length-b.length+1){
lastQuotient +="."+ (quotient[j]-1); // 소수점 인식하기
}else{
lastQuotient +=quotient[j]-1; // 최종 몫
};
}
lastQuotient = Trim(lastQuotient,"0"); // 좌우측의 필요없는 0 없애기
if(lastQuotient.substr(0,1) ==".") lastQuotient = "0"+lastQuotient; // 맨 앞이 "."이면 앞에 0 추가하기
if(lastQuotient.substr(lastQuotient.length-1,1)=="."){
lastQuotient = lastQuotient.substring(0,lastQuotient.length-1); // 마지막이 "."이면 "." 없애기
}
var last = lastQuotient; ////최종곱 결과
return last; //최종곱 결과
}
//=======================================================//
///////////////////////////////////////////////
//////// 양수, 음수가 있는 나누기 프로그램 /////////
///////////////////////////////////////////////
//=======================================================//
function Division(a,b){
a = TrimLeft(a,"0");
if ( a == ""){a = "0"};
b = TrimLeft(b,"0");
if ( b == ""){b = "0"};
var last = ""; // 최종 결과
if (a.substr(0,1) == "-" && b.substr(0,1) != "-" ){ // a가 음수, b가 양수인 경우
last = "-"+DivisionPlus(a.substring(1), b)
}else if(a.substr(0,1) != "-" && b.substr(0,1) == "-" ){// a가 양수, b가 음수인 경우
last = "-"+DivisionPlus(a, b.substring(1))
}else if(a.substr(0,1) == "-" && b.substr(0,1) == "-" ){// a가 음수, b가 음수인 경우
last = DivisionPlus(a.substring(1), b.substring(1))
}else{ // a가 양수, b가 양수인 경우
last = DivisionPlus(a, b)
}
return last; //최종합 결과
}
//=======================================================//
// 원하는 문자 앞까지 추출하기 함수
//=======================================================//
function FindChar(st,xx){ // 문자열(st)에서 문자(xx) 찾기
st=st.substring(0,st.indexOf(xx)); // 좌측에서 xx 앞까지 추출하기
return st;
}
//=======================================================//
// 몫 구하기 함수
//=======================================================//
function MathFloor(a,b){
a = TrimLeft(a,"0");
if ( a == ""){a = "0"};
b = TrimLeft(b,"0");
if ( b == ""){b = "0"};
var digit = 1; // 소수점 1 이하 자리수(숫자로 바꿈)
if (digit == ""){ ; //입력이 없으면 소수점이하 10자리로 계산
if (a.length-b.length <1){
digit = 11;
}else{
digit = (a.length-b.length+11)
}
}else{
if (a.length-b.length <1){
digit += 1;
}else{
digit += (a.length-b.length+1)
}
}
var quotient = new Array();
var remainder = new Array();
remainder[0] = a.substr(0,b.length); // b의 길이 만큼씩 잘라 나누기 해야함.
quotient[0] = 0 ; //초기화
lastQuotient = "0"; // 최종 몫
for (var j = 0 ; j<digit ; j++){ // 소수점 이하 digit자리까지 계산하는 알고리즘
remainder[j] = TrimLeft(remainder[j],"0"); // 왼쪽의 0 제거(8진법으로 인식 방지)
if(remainder[j] == ""){remainder[j] = "0"}; // 자리수 나누기에서 오류 보정
while (remainder[j].substr(0, 1) != "-" ){ // 각 단계별 몫 구하기
remainder[j] = TrimLeft(SubtractPlus(remainder[j], b),"0");// 왼쪽의 0 제거(8진법으로 인식 방지)
quotient[j] += 1 ;
if(remainder[j] == ""){
remainder[j] = "0";
quotient[j] += 1 ;
break;
}; // 자리수 나누기에서 오류 보정
}
// document.write( "Remainder0= "+ remainder[j] +"<p>") ;
quotient[j+1] = 0 ;
if (j > a.length-b.length-1){ // a의 길이 만큼 나누기를 한 경우 몫을 0으로 채우기
var jj = "0";
}else{
jj= a.substr(j+b.length,1) // 피젯수가 b의 길이보다 큰 경우 a에서 하나씩 가져옴
};
if (remainder[j] == "0"){
remainder[j+1] = TrimLeft(remainder[j]+jj,"0");// 왼쪽의 0 제거(8진법으로 인식 방지)
}else{
remainder[j+1] = TrimLeft(Addition(remainder[j], b)+jj,"0");// 왼쪽의 0 제거(8진법으로 인식 방지)
};
if (a.length-b.length <-1 && j==0){ // 완성된 것임
lastQuotient += "."; // 소수점 인식하기
}else if(a.length-b.length <-1 && j>0){
lastQuotient += (quotient[j]-1); // 소수점 인식하기
}else if(a.length-b.length == -1 && j == 0){
lastQuotient +="."; // 소수점 인식하기
}else if(a.length-b.length == -1 && j > 0){
lastQuotient += (quotient[j]-1); // 소수점 인식하기
}else if(j == a.length-b.length+1){
lastQuotient +="."+ (quotient[j]-1); // 소수점 인식하기
}else{
lastQuotient +=quotient[j]-1; // 최종 몫
};
}
function Trim(st,xx){ // 문자열(st)에서 좌우측 필요 없는 문자(xx) 없애기
while(st.indexOf(xx)==0) st=st.substring(1);// 좌측의 필요없는 0 없애기
while(st.lastIndexOf(xx)==st.length-1) st=st.substring(0,st.length-1);// 우측의 필요없는 0 없애기
return st
}
lastQuotient = Trim(lastQuotient,"0"); // 좌우측의 필요없는 0 없애기
if(lastQuotient.substr(0,1) ==".") lastQuotient = "0"+lastQuotient; // 맨 앞이 "."이면 앞에 0 추가하기
if(lastQuotient.substr(lastQuotient.length-1,1)=="."){
lastQuotient = lastQuotient.substring(0,lastQuotient.length-1); // 마지막이 "."이면 "." 없애기
}
lastQuotient2 = FindChar(lastQuotient,"."); //// 몫 추출하기
if (lastQuotient2 == ""){lastQuotient2 = lastQuotient};
var lastRemainder = Subtract(a,Multiple(lastQuotient2,b)); //// 나머지 추출하기
return lastQuotient2; //몫 결과
}
//=======================================================//
// 지수 거듭 제곱 함수
//=======================================================//
function MathPow(a,b){
a = TrimLeft(a,"0");
if ( a == ""){a = "0"};
b = TrimLeft(b,"0");
if ( b == ""){b = "0"};
var result = "1";
if (a == "0"){
result = "0";
}else if (b == "0"){
result = "1";
}else{
for (var j = 0 ; j<b ; j++){ // 거듭제곱
result = Multiple(result,a); //
};
}
return result; //몫 결과
}
//=======================================================//
// 나머지 구하기 함수
//=======================================================//
function MathRemainder(a,b){
a = TrimLeft(a,"0");
if ( a == ""){a = "0"};
b = TrimLeft(b,"0");
if ( b == ""){b = "0"};
var digit = 1; // 소수점 1 이하 자리수(숫자로 바꿈)
if (digit == ""){ ; //입력이 없으면 소수점이하 10자리로 계산
if (a.length-b.length <1){
digit = 11;
}else{
digit = (a.length-b.length+11)
}
}else{
if (a.length-b.length <1){
digit += 1;
}else{
digit += (a.length-b.length+1)
}
}
var quotient = new Array();
var remainder = new Array();
remainder[0] = a.substr(0,b.length); // b의 길이 만큼씩 잘라 나누기 해야함.
quotient[0] = 0 ; //초기화
lastQuotient = "0"; // 최종 몫
for (var j = 0 ; j<digit ; j++){ // 소수점 이하 digit자리까지 계산하는 알고리즘
remainder[j] = TrimLeft(remainder[j],"0"); // 왼쪽의 0 제거(8진법으로 인식 방지)
if(remainder[j] == ""){remainder[j] = "0"}; // 자리수 나누기에서 오류 보정
while (remainder[j].substr(0, 1) != "-" ){ // 각 단계별 몫 구하기
remainder[j] = TrimLeft(SubtractPlus(remainder[j], b),"0");// 왼쪽의 0 제거(8진법으로 인식 방지)
quotient[j] += 1 ;
if(remainder[j] == ""){
remainder[j] = "0";
quotient[j] += 1 ;
break;
}; // 자리수 나누기에서 오류 보정
}
// document.write( "Remainder0= "+ remainder[j] +"<p>") ;
quotient[j+1] = 0 ;
if (j > a.length-b.length-1){ // a의 길이 만큼 나누기를 한 경우 몫을 0으로 채우기
var jj = "0";
}else{
jj= a.substr(j+b.length,1) // 피젯수가 b의 길이보다 큰 경우 a에서 하나씩 가져옴
};
if (remainder[j] == "0"){
remainder[j+1] = TrimLeft(remainder[j]+jj,"0");// 왼쪽의 0 제거(8진법으로 인식 방지)
}else{
remainder[j+1] = TrimLeft(Addition(remainder[j], b)+jj,"0");// 왼쪽의 0 제거(8진법으로 인식 방지)
};
if (a.length-b.length <-1 && j==0){ // 완성된 것임
lastQuotient += "."; // 소수점 인식하기
}else if(a.length-b.length <-1 && j>0){
lastQuotient += (quotient[j]-1); // 소수점 인식하기
}else if(a.length-b.length == -1 && j == 0){
lastQuotient +="."; // 소수점 인식하기
}else if(a.length-b.length == -1 && j > 0){
lastQuotient += (quotient[j]-1); // 소수점 인식하기
}else if(j == a.length-b.length+1){
lastQuotient +="."+ (quotient[j]-1); // 소수점 인식하기
}else{
lastQuotient +=quotient[j]-1; // 최종 몫
};
}
function Trim(st,xx){ // 문자열(st)에서 좌우측 필요 없는 문자(xx) 없애기
while(st.indexOf(xx)==0) st=st.substring(1);// 좌측의 필요없는 0 없애기
while(st.lastIndexOf(xx)==st.length-1) st=st.substring(0,st.length-1);// 우측의 필요없는 0 없애기
return st
}
lastQuotient = Trim(lastQuotient,"0"); // 좌우측의 필요없는 0 없애기
if(lastQuotient.substr(0,1) ==".") lastQuotient = "0"+lastQuotient; // 맨 앞이 "."이면 앞에 0 추가하기
if(lastQuotient.substr(lastQuotient.length-1,1)=="."){
lastQuotient = lastQuotient.substring(0,lastQuotient.length-1); // 마지막이 "."이면 "." 없애기
}
lastQuotient2 = FindChar(lastQuotient,"."); //// 몫 추출하기
if (lastQuotient2 == ""){lastQuotient2 = lastQuotient};
var lastRemainder = Subtract(a,Multiple(lastQuotient2,b)); //// 나머지 추출하기
if (lastRemainder == ""){lastRemainder = 0};
return lastRemainder; //나머지 결과
}
//=======================================================//
// a를 b진법으로 나타내기 함수
//=======================================================//
function MathJinbup(a,b){
var jinbup = ""; // 진법(mod b)의 결과
while(a != 0){
if (Number(MathRemainder(a,b))>9){ // 숫자가 10보다 크면 ab... 문자로 나타내기
var rem = String.fromCharCode(Number(MathRemainder(a,b))+ 87)
}else{
var rem = MathRemainder(a,b)
};
jinbup = rem+jinbup;
a = MathFloor(a,b);
}
return jinbup;
}
</script>
댓글 달기