2014-03-04 2 views
0

누군가가 왜이 프로그램이 작동하는지 설명 할 수 있기를 바랬습니다. 나는 초급자이다. 프로그램은 사용자가 입력 한 숫자를 반대로 반환한다 (예 : 1234 = 4321). reverse가 0으로 초기화되면 왜 7 번째 줄이 의미가 있나? 미안해. 제목을 묻는 법을 모르겠다.왜이 루프가 작동합니까?

int n, reverse=0, rem; 
printf("Enter an integer: "); 
scanf("%d", &n); 
while(n!=0) 
{ 
rem=n%10; 
reverse=reverse*10+rem; 
n/=10; 
} 
+0

http://stackoverflow.com/questions/20477728/understanding-number-reversing-using-loop?rq = 1 이 답변은 내가 찾을 수있는 가장 가까운 것이었지만 printfs를 사용하여 무슨 일이 일어나고 있는지 알았는데 왜 역방향으로 값을 가져올 지 모르겠습니다. – mungostrap

+3

'reverse = reverse * 10 + rem;''reverse * 10 == 0 '부터 처음으로 reverse는'rem'으로 설정됩니다. 후속 실행에서,'reverse> 0', 그래서 라인은 예상대로 작동합니다. – ChicagoRedSox

+1

왜 무언가를 0으로 곱하는 것이 합리적입니까?! –

답변

4

이 코드는 정수 연산자 %를 사용하는 방법을 활용 /하고 *에 :

  • 숫자의 맨 오른쪽 소수 자리 수 : 1234/10 == 123
  • : 1234 % 10 == 4
  • 숫자의 맨 오른쪽 소수 자리를 제거
  • 숫자의 오른쪽에 숫자를 추가하여 123 * 10 + 4 == 1234

가 반복 n 오프 숫자 및 그 소요

123 0 
12 3 
1 32 
0 321 

단계 손으로 코드를 통해 그것을 이해한다 : reverse에 그들을 밀어. n == "123"의 초기 값을 취하십시오.

Is n zero? No, so go into the loop. 
rem = n%10 == 123 % 10 == 3 
reverse = reverse * 10 + rem == 0 * 10 + 3 == 3 
n = n/10 == 123/10 == 12 

Is n zero? No, so loop around. 
rem = n%10 == 12 % 10 = 2 
reverse = reverse * 10 + rem == 3 * 10 + 2 == 32 
n = n/10 == 12/10 = 1 

Is n zero? No, so loop around.. 
rem = n%10 == 1 % 10 = 1 
reverse = reverse * 10 + rem == 32 * 10 + 1 == 321 
n = n/10 == 1/10 = 0 

Is n zero? Yes, so leave the loop. 
reverse == 321 

또는 제로의 입력으로 다시 시작 :

Is n zero? Yes, so leave the loop. 
reverse == 0 

이 프로그램은 상당히 무의미하지만 같은 원칙 16 (16 진수)와이 같은 다른 기지에서 일하는 것을 깨닫고 가치 (바이너리) - 프로그래밍의 특정 종류를 끝내면 유용 할 것입니다.

+0

모든 답변이 훌륭 했었지만 당신이 당신의 노력에 도움을 주었기 때문에 그것을 이해하는 데 정말로 도움이되었습니다. 그래서 대답으로 선택하겠습니다! 감사! – mungostrap

1

역방향이 0이면 "역방향 * 10 + rem"값은 단순히 "rem"입니다.

1

나머지 n%10 마지막 진수 효과적으로 삭제 (n = n/10 동일) 라인에 n/=10 정수 나눗셈을 사용하는 반면, N 항상 마지막 진수이다. 따라서 rem은 차례대로 n의 각 10 진수가되며, 최하위 자리부터 시작합니다. 이전에 추가 된 자릿수를 왼쪽 (reverse*10) 한 자리 위로 이동하면서 끝에 숫자를 항상 (+rem) 추가하여 역방향을 구성합니다. 선행 0 (예 : reverse)은 효과가 없습니다 (0*10 == 0).

이유는 reverse이 초기화 되었기 때문입니다. 초기화되지 않은 변수의 초기 값은 C에서 정의되지 않았으므로 다른 값은 첫 번째 reverse*10에서 벗어날 수 있습니다. 또한 숫자로 0을 입력하면 루프 조건은 false이고 루프 본문은 절대로 실행되지 않지만 0의 역순이 올바른 것입니다 (0).

2

단계별로 살펴 보겠습니다.

  1. rem=n%10;

    1234 % 10 4.
  2. reverse=reverse*10+rem; (당신이 경우, 왼쪽 값 시프트) (10)에 의해 배수의 값을 다음 수단 1234의 경우 10으로 나눈 rem 나머지 소요 rem을 추가합니다. 루프의 제 차례로, 그 값이 10이기 때문에, 우리는 단순히 제
  3. n/=10;의 결과를,도 4에 추가하여이 1234/10 = 123 (모든 소수가 손실되는) 것을 의미한다 (10)에 의해 정수 분할된다.
  4. 루프의 새로운 전환! 지금, 제 라인 rem= 123 % 10; 또는 3
  5. reverse=reverse*10+rem;reverse=4*10+3; 또는 43 (여기 패턴의 시작을 통지?) 지금 그래서
  6. n/=10; 지금 n = 12;

반복 단계 4까지 n = 12 6 행 n = 0. 나는 그것을 독자에게 운동으로 남겨 둘 것이다.각 루프 반복 적용

1
int n, reverse=0, rem; 
printf("Enter an integer: "); 
scanf("%d", &n); //read in a number 
while(n!=0) //while that number has digits to process 
{ 
rem=n%10; //find out what's in the 1s place 
reverse=(reverse * 10) + //move our current answer up a position 
      rem;   //and then add in the last digit. 
          // if it's 0 that's the digit we want 
          //so leaving it as is will be fine. 
n/=10; //chop one digit off. Since integer division 
     //truncates this will drop the last digit rather 
     //than leave a fraction and always rounds toward 0 
} 
1

변수 값으로서 도시되는 바와 같이,

rem = 4 
reverse = 0 + 4 = 4 
n = 123 

rem = 3 
reverse = 40 + 3 = 43 
n = 12 

rem = 2 
reverse = 430 + 2 = 432 
n = 1 

rem = 1 
reverse = 4320 + 1 = 4321 
n = 0 

n와 단부 루프가 종료 printf()들 디버거이 순차 실행 또는 사용 0

1

된다 반면 당신의 질문에 대답 하겠지만, 펜과 종이 (또는 디지털 펜과 종이)로 이것을 할 수있는 간단한 프로그램입니다.

때문에 integer division
때문에 modulus operator의 작동 rem=n%10 라인의 작동 n/=10
printf("Enter an integer: "); 
scanf("%d", &n); // so say the number is 103 
while(n!=0)  // n=103 so we enter the loop 
{ 
rem=n%10;    // rem = 3 
reverse=reverse*10+rem; // reverse = 0*10 + 3 = 0 + 3 = 3 
n/=10;     // n = 103/10 = 10 
} 

라인입니다.
이 줄은 Operator precedence 때문에 reverse=reverse*10+rem이 작동하며, 곱셈 (*)이 더하기 (+)보다 우선하므로 먼저 수행됩니다. 이것은 C와는 다르며 basic mathematics과 동일합니다.

rem=n%10;    // rem = 1 
reverse=reverse*10+rem; // reverse = 30*10 + 1 = 300 + 1 = 301 
n/=10;     // n = 1/10 = 0 

: 1 그래서 루프가 계속 여전히 0이 아닌,

rem=n%10;    // rem = 0 
reverse=reverse*10+rem; // reverse = 3*10 + 0 = 30 + 0 = 30 
n/=10;     // n = 10/10 = 1 
그래서

지금 n==1reverse==30 :

그래서

지금 n==10reverse==3, 10는 0이 아닌 그래서 루프가 계속 여전히 이제는 루프가 멈 춥니 다. 왜냐하면 n==0이고 그 반대로는 주어진 입력의 반대 인 301입니다. 103

관련 문제