계수를 이용한 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 ints(그리고 ASCII 텍스트, 8비트 바이트 및 코드에 필요한 기타 모든 가정)와 코드의 기술적으로 잘못된 현대 C에 대한 모든 내용을 무시하면 "지금까지 이해한 것"이 정확합니다.
gets(&n)
A, 공간 및 B의 ASCII 값을 첫 번째 3바이트에 저장합니다.n
또한 null 터미네이터를 4번째 바이트에 저장합니다.이러한 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바이트의 빅 엔디안 ints를 사용하면
(A*256*256*256 + space*256*256 + B*256) % 85 = (B + space + A) % 85
endianness는 4바이트의 int만 있으면 상관없습니다.(예를 들어 8바이트의 ints에서는 ints의 바이트 수를 걱정해야 합니다.n
그거gets
설정되지 않았습니다.)
공간은 ASCII 32, 숫자 문자의 ASCII 값은 48 + 숫자 값입니다.정의a
그리고.b
(숫자 문자의 ASCII 값이 아닌) 입력된 숫자의 수치로서
(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
'programing' 카테고리의 다른 글
Vuetify 자동 완성 첫 번째 결과만 표시됨 (0) | 2022.08.14 |
---|---|
밝은 테마와 어두운 테마 간의 Vuetify 전환(vuex 사용) (0) | 2022.08.14 |
동적 외부 데이터를 반응적으로 처리하도록 VueJ/VueX 애플리케이션을 구성하는 방법 (0) | 2022.08.14 |
잭슨 - 범용 클래스를 사용하여 역직렬화 (0) | 2022.08.14 |
snprintf 및 Visual Studio 2010 (0) | 2022.08.14 |