2014-01-25 4 views
0

사용자에게 4 자리 숫자를 묻는 중입니다. 그런 다음 각 숫자를 (해당 숫자 + 7의 합계) 모듈러스 10으로 바꿉니다. 그런 다음 첫 번째 숫자를 세 번째 숫자로 바꾸고 두 번째 숫자를 네 번째 숫자로 바꿉니다. 그런 다음 암호화 된 숫자를 출력하십시오. 그래서 내가 1234에 입력하면 0189로 암호화하거나 5948에 입력하고 1526으로 암호화해야합니다.4 자리 입력 및 변경 순서 적용

문제는 9810과 6251입니다. 나는 가깝지만 잘못된 순서로있다.

<script type="text/javascript"> 


    var temp; 
    var number; 
    var first; 
    var second; 
    var third; 
    var fourth; 
    var fifth; 
    //prompt for first number 

    do { 
     inputNumber = window.prompt("Enter only a 4 digit number"); 
     if ((isNaN(inputNumber) || !(inputNumber.length == 4))) 
      window.alert("please enter a number or length of 4"); 

    } while ((isNaN(inputNumber)) || !(inputNumber.length == 4)); 

    //temp = inputNumber; 

    temp = parseInt(inputNumber); 
    first = temp % 10; //process each number one by one 
    temp = temp/10; 
    second = temp % 10; 
    temp = temp/10; 
    third = temp % 10; 
    temp = temp/10; 
    fourth = temp % 10; 

    swap = first; 
    first = third; 
    third = swap; 

    swap = second; 
    second = fourth; 
    fourth = swap; 

    first = parseInt(first); 
    second = parseInt(second); 
    third = parseInt(third); 
    fifth = parseInt(fifth); 
    fourth = parseInt(fourth); 

    first = (first + 7) % 10 
    second = (second + 7) % 10 
    third = (third + 7) % 10 
    fourth = (fourth + 7) % 10 

    var incrypted = first * 1000 + second * 100 + third * 10 + fourth * 1; 
    //var incrypted = first * 1000 + second + third * 10 + fourth * 1; 
    document.writeln("<h1>The number " + inputNumber + " is encrypted as " + incrypted + ".</h1><br />"); 

</script> 
+0

난 당신의 코드를 가지고 (정말 이런 식으로 뭔가를 디버깅하는 가장 좋은 도구이다) Node.js를 함께 실행 vec: [0, 1, 8, 9]는 fifth'이 정의되지 '라고 말한다. – bluefeet

답변

1

당신은 개별적으로 숫자를 처리하는 더 좋을 수도있다보십시오.

var digits = inputNumber.split(""); 
digits[0] = (+digits[0]+7)%10; 
digits[1] = (+digits[1]+7)%10; 
digits[2] = (+digits[2]+7)%10; 
digits[3] = (+digits[3]+7)%10; 
digits.push(digits.shift()); 
digits.push(digits.shift()); 
// rotating by two results in 1234 becoming 3412, same result just more efficient! 
var result = digits.join(""); 
+0

고맙습니다. 제대로 작동한다고 생각합니다. –

+1

명심해야 할 것은이 답변이 당신에게 보여주기를 바란다는 것입니다. 문제를 해결하기 위해 항상 한 가지 이상의 방법이 있다는 것입니다.) –

0

var num = "1234" 
var digits = num.split(""); 
var out = []; 
for(var i=0; i<digits.length; i++){ 
    digits[i] = (parseInt(digits[i])+7)%10; 
} 
var end = [digits[2],digits[3],digits[0],digits[1]].join(""); 
console.log(end.join("")); 
0

셔플 기능 :

function shuffle(val){ 
    val = val + ""; 
    function transform(num) { return (+num + 7) % 10 + ""; } 

    return transform(val[2]) + 
      transform(val[3]) + 
      transform(val[0]) + 
      transform(val[1]); 
} 

일부 유효성 검사 :

function shuffle(val){ 
    val = val + ""; 
    if(isNaN(val)) throw "a valid number is required"; 
    if(val.length != 4) throw "a four-digit number is required"; 

    function transform(num) { return (+num + 7) % 10 + ""; } 

    return transform(val[2]) + 
      transform(val[3]) + 
      transform(val[0]) + 
      transform(val[1]); 
} 
0

이것은 % 운영자가 작동하는 방법의 근본적인 오해로 내려 온다. % 연산자에 대한

MDN 기준이 상태 :

모듈로 함수 VAR2로 나눈 VAR1의 정수 나머지이다. 입력 1234와 함께, 귀하의 예를 복용 예를 들어 , 12 % 5 반환 2.

는 먼저이 코드에서 1234의 모듈로 10을 찾는 :

first = temp % 10; 

1234의 모듈은 4인데, 123010으로 나눠지기 때문에, 나머지는 4입니다. 따라서 당신의 논리는 일을 역전시킵니다. 당신은 되돌릴 수 코드의 시작 부분에 물건을 조금 바꿀 수 :

fourth = temp % 10; //process each number one by one 
temp = temp/10;. 
third = temp % 10;. 
temp = temp/10; 
second = temp % 10; 
temp = temp/10; 
first = temp % 10; 

당신이 코드를 위와 같이 고정 당신이 다시 함께 숫자를 대답으로 출력 189 빗질하는 것이기 때문에 문제가 여전히있다 0 + 1 + 8 + 9 = 189 에서처럼 문자열 연결이 아닌 더하기 산술 연산을 사용합니다. 마지막 줄을 이렇게 수정하면 다음과 같이 수정됩니다.

var incrypted = first + '' + second + '' + third + '' + fourth; 
0

이것은 나를 위해 일했습니다.

<script> 
    var vec = new Array("1","2","3","4"); 

    for(var i = 0; i<4; ++i){ 
     vec[i] = (+vec[i] + 7) % 10; 
    } 

    var tmp = vec[1]; 
    vec[1] = vec[3]; 
    vec[3] = tmp; 

    vec = vec.reverse(); 

    tmp = Number(vec.splice(0,1)); 

    vec.push(tmp); 

    console.log("vec:", vec); 
</script> 

로그