계수를 사용한 C 추가
를 인쇄하는 흥미로운 C 코드를 발견 A + B
했지만 이해하는 데 어려움이 있습니다.
입력 형식 :
A B
여기서 A
, B
사이의 정수이다 0
및 10
단일 공간으로 분리된다.
암호:
main( n )
{
gets( &n );
printf("%d", n % 85 - 43);
}
이것은 짧은 코딩을위한 것이므로 경고에 신경 쓰지 마십시오.
내가 지금까지 이해 한 것 :
gets( &n )
A, 공백 및 B의 ASCII 값을의 하위 3 바이트에 저장 n
합니다. 예를 들어, A = 3
및 B = 8
얻을 것이다 n = 0x00382033
. 주어진 조건 n
은 넘침을 방지 합니다. 그러나 나는 어떻게 n % 85 - 43
산출 하는지 이해하지 못한다 A + B
.
이 숫자를 어떻게 생각합니까?
little-endian int (ASCII 텍스트, 8 비트 바이트 가정, 코드에 필요한 기타 모든 가정)를 사용하고 코드에서 기술적으로 잘못된 모든 C 항목을 무시하면 "내가 이해하는 내용 지금까지 "가 맞습니다.
gets(&n)
A, 공백 및 B의 ASCII 값을의 처음 3 바이트에 저장 n
합니다. 또한 4 번째 바이트에 null 종결자를 저장합니다. 이들의 바이트에 해당 ASCII 값 저장 n
에 결과 n
값을 가지고 B*256*256 + space*256 + A
, 여기서 B
, space
및 A
대응하는 ASCII 값을 나타낸다.
256 mod 85는 1이므로 모듈 식 산술의 속성에 따라
(B*256*256 + space*256 + A) % 85 = (B + space + A) % 85
덧붙여서, 4 바이트 빅 엔디안 정수를 사용하면
(A*256*256*256 + space*256*256 + B*256) % 85 = (B + space + A) % 85
따라서 4 바이트 정수가있는 한 엔디안은 중요하지 않습니다. (더 큰 이하의 int 문제가 될 수있다, 예를 들어, 8 바이트의 int로, 우리의 바이트에 무엇에 대해 걱정할 필요가 것 n
이 gets
설정되지 않았다.)
공백은 ASCII 32이고 숫자 문자의 ASCII 값은 48 + 숫자 값입니다. 입력 한 숫자의 숫자 값 (숫자 문자의 ASCII 값이 아닌)을 정의 a
하고b
(B + space + A) % 85 = (b + 48 + 32 + a + 48) % 85
= (a + b + 128) % 85
= (a + b + 43) % 85
(B + space + A) % 85 - 43 = (a + b + 43) % 85 - 43
= (a + b) % 85
= a + b
마지막 두 동등성는 사실에 의존 곳 a
과는 b
0에서 9까지의 값을.
참고 URL : https://stackoverflow.com/questions/51414717/c-addition-using-modulus
'developer tip' 카테고리의 다른 글
도대체 Excel이 같은 이름의 파일 2 개를 처리 할 수없는 이유는 무엇입니까? (0) | 2020.10.08 |
---|---|
동일한 시스템에서 여러 Java 프로그램이 실행되는 경우 (0) | 2020.10.08 |
고정 크기 부동 소수점 유형 (0) | 2020.10.08 |
REST Api에 대한 자동 테스트 (0) | 2020.10.08 |
REST-본문에 ID를 넣을까요? (0) | 2020.10.08 |