티스토리 뷰
int 는 4byte 크기
4byte 는 4 x 8bit = 32bit
즉, 2^32 = 2의 32제곱 만큼의 크기 표현 가능
2^32 = 2^(10*10*10*4) = 1024*1024*1024*4 = 4,294,967,296 만큼 표현가능
절반은 양수, 절반은 음수를 가르키므로
양수의 최대값은 2,147,483,647 으로 10자리를 넘는 값을 표현 할 수 없다.
자료형 중 가장 큰 값을 표현 가능한 8byte 크기의 unsigned long long 인 ull 은 18,446,744,073,709,551,615 까지 표현 가능하며 20자리를 넘는 값을 표현 할 수 없다.
덧셈을 한 결과 값이 위 자료형의 크기를 초과 하는 경우에도 해당 자료형으로 값을 저장하는 경우 해당 값을 표현 할 수 없다. 이러한 경우 원하는 자리수 크기의 int 행렬을 이용해서 연산을 수행하고 char형 배열로 string 형태의 자료형으로 숫자 값을 구 해야 한다.
유형 이름 | 바이트 | 기타 이름 | 값의 범위 |
int | 4 | signed | –2,147,483,648 ~ 2,147,483,647 |
unsigned int | 4 | unsigned | 0 ~ 4,294,967,295 |
__int8 | 1 | char | -128 ~ 127 |
unsigned __int8 | 1 | unsigned char | 0 ~ 255 |
__int16 | 2 | short, short int, signed short int | –32,768 ~ 32,767 |
unsigned __int16 | 2 | unsigned short, unsigned short int | 0 ~ 65,535 |
__int32 | 4 | signed, signed int, int | –2,147,483,648 ~ 2,147,483,647 |
unsigned __int32 | 4 | unsigned, unsigned int | 0 ~ 4,294,967,295 |
__int64 | 8 | long long, signed long long | –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
unsigned __int64 | 8 | unsigned long long | 0 ~ 18,446,744,073,709,551,615 |
bool | 1 | 없음 | false 또는 true |
char | 1 | 없음 | 기본적으로-128 ~ 127 을 사용 하 여 컴파일한 경우 0에서 255 /J |
signed char | 1 | 없음 | -128 ~ 127 |
unsigned char | 1 | 없음 | 0 ~ 255 |
short | 2 | short int, signed short int | –32,768 ~ 32,767 |
unsigned short | 2 | unsigned short int | 0 ~ 65,535 |
long | 4 | long int, signed long int | –2,147,483,648 ~ 2,147,483,647 |
unsigned long | 4 | unsigned long int | 0 ~ 4,294,967,295 |
long long | 8 | 없음 (그러나와 동일 __int64 ) | –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
unsigned long long | 8 | 없음 (그러나와 동일 unsigned __int64 ) | 0 ~ 18,446,744,073,709,551,615 |
enum | 다름 | 없음 | |
float | 4 | 없음 | 3.4E+/-38(7개의 자릿수) |
double | 8 | 없음 | 1.7E+/-308(15개의 자릿수) |
long double | 와 동일 합니다. double | 없음 | 와 동일 합니다. double |
void sumArr(int L[], int R[], int sum[]){
int loopIndex, supp = 0;
for(loopIndex = 0;loopIndex<SIZE;loopIndex++) {
sum[loopIndex] = L[loopIndex] + R[loopIndex] + supp;
if (sum[loopIndex] > 9) {
sum[loopIndex] -= 10;
supp = 1;
}
else{
supp = 0;
}
}
}
위 함수의 원리는 아래 그림과 같다.
이때 자릿수는 거꾸로 집어 넣는편이 좋다. 단순히 거꾸로 출력시키면 우리가 큰 자릿수부터 써내려가는 것처럼 출력을 할 수 있으므로 이 방법을 선택하였다. 즉 각 배열은 숫자의 자릿수들을 포함하고 있으니 하나의 숫자를 의미한다고 보면 된다. 세 번째 매개변수는 두 수의 합인데 이는 다른 방법을 사용해도 좋다.
자릿수를 거꾸로 배열에 입력한 덕분에 for문에서 인덱스를 0부터 시작하면서 계산하여 합배열에 낮은 자릿수부터 저장할 수 있게 되었다.
중요한 것은 각 자릿수를 더할 때 합이 10을 넘지 않는다면 좋겠지만, 넘는 경우의 처리다.
분기문에 따라 10을 초과한다면 자릿수의 합에서 10을 빼고 supp는 1이 된다. 즉 다음 자릿수에 1을 더하는 것이다. 그렇지 않는다면 불필요한 자릿수 덧셈을 방지하기 위해 supp는 0으로 다시 지정해주고 계속 루프를 돈다. 이 supp는 다음 자릿수에서 두 수의 각 자릿수에 더해진다.
그리고 int <-> char 사이에 숫자 변환 진행시에는 한자리수 씩 아래와 같은 방법을 사용한다.
char c = '5';
int n = c - '0';
///////////////////
int n = 5;
char c = n + '0';
'Computer > Algorithms' 카테고리의 다른 글
[Algorithms] 후위수식 변환 및 예제코드 (0) | 2023.02.08 |
---|---|
[Stack] 전위수식(prefix), 후위수식(postfix), 중위수식(infix) (0) | 2023.02.08 |
[Algorithms] Hash (0) | 2020.10.13 |
[Programming Challenges] 문제12 암호깨기 (Crypt Kicker) (0) | 2017.07.05 |
[Programming Challenges] 문제1 3n+1문제 (0) | 2017.07.05 |