[CodeUp] 기초 100제
by me
19/06/26
CodeUp 기초 100제를 풀면서 헷갈리는 내용 정리한 내용
1019 연월일 입력받아 형식에 맞게 출력하기
입력 : 2012.02.15
출력 : 2012.02.15.
- Tip
scanf(“%d”,&a);
printf(“%d”,a);
%d -> 2
%02d -> 02
%04d -> 0002
1022 문장 한 개 입력받아 그대로 출력하기
입력 : C++ programming is very fun!!
출력 : C++ programming is very fun!!
- Tip
char data[2001]
// 키보드(stdin)로 입력 받아 최대 2000 문자(영문자)까지 data[] 공간에 저장하고 출력할 수 있다. 한글의 경우 1000글자까지 가능
fgets(data,2000,stdin);
printf(“%s”, data);
1025 정수 한 개 입력받아 나누어 출력하기
입력 : 75254
출력 : [70000]
[5000]
[200]
[50]
[4]
- 코드
#include <cstdio>
#pragma warning(disable: 4996)
int main() {
int a, b, i=10000;
scanf("%d",&a);
while(i>0){
b = (a / i)*i; // ex) (75254/10000)*10000
printf("\[%d\]\n", b);
a = a – b; // 75254 - 70000
i = i / 10; // i = 10000 / 10
}
return 0;
}
1028 정수 한 개 입력받아 그대로 출력하기2 : unsigned int
int a (정수)의 범위 -> -2147483648 ~ +2147483647
printf(“%d or %i”,a);
unsigned int a -> 0 ~ 4294967295
scanf(“%u”,&a);
printf(“%u”,a);
1029 실수 한 개 입력받아 그대로 출력하기2 : float&double
float a -> 3.410^-38 ~ 3.410^38
double a -> 1.710^-308 ~ 1.710^308
1030 정수 한 개 입력받아 그대로 출력하기3 : long long int
long long int a -> –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
scanf(“%lld”, &a);
printf(“%lld”, a);
1047 비트 시프트연산 : 정수 한 개 입력받아 2 곱해 출력하기
// 입력 : 1024
// 출력 : 2048
int a = 10
printf(“%d”,a<<1); // 20 출력
printf(“%d”,a>>1); // 5 출력
printf(“%d”,a<<2); // 2번 시프트 40 출력
printf(“%d”,a>>2); // 2 출력
1059 : 비트단위로 바꿔 출력하기
비트단위(bitwise) 연산자
.~ (bitwise not),
.& (bitwise and),
.| (bitwise or),
.^ (bitwise xor),
.« (bitwise left shift),
.» (bitwise right shift)
- Tip
1 (32비트 2진수로 표현하면 00000000 00000000 00000000 0000001) 이 입력되었을 때,
~1은 -2(11111111 11111111 11111111 11111110) 가 된다.
음의 정수의 “2의 보수 표현” 방법
예를 들어 int형(4바이트(byte), 32비트)으로 선언된 변수에 양의 정수 5를 저장하면
5의 2진수 형태인 101이 32비트로 만들어져
00000000 00000000 00000000 00000101
로 저장된다.(공백은 보기 편하도록 임의로 분리)
int 형의 정수 0은
00000000 00000000 00000000 00000000
그리고, -1은 0에서 1을 더 빼고 32비트만 표시하는 형태로
11111111 11111111 11111111 11111111
로 저장된다.
-2는? -1에서 1을 더 빼면 된다.
11111111 11111111 11111111 11111110
로 저장된다.
그래서…
int 형으로 선언된 변수에는
최소
-2147483648 을 의미하는
10000000 00000000 00000000 00000000
부터
최대
+2147483647 을 의미하는
01111111 11111111 11111111 11111111
로 저장될 수 있는 것이다.
그렇다면…
-2147483648
10000000 00000000 00000000 00000000
에서 1을 더 뺀다면?
01111111 11111111 11111111 11111111
이 된다. 즉 -2147483649 가 아닌 +2147483647이 되는 것이다.
이러한 것을 오버플로우(overflow, 넘침)이라고 한다.
한편, 이러한 내용을 간단히 표시하면
정수 n이라고 할 때,
~n = -n - 1
-n = ~n + 1 과 같은 관계로 표현된다.
& (bitwise and)
3 : 00000000 00000000 00000000 00000011
5 : 00000000 00000000 00000000 00000101
3&5 : 00000000 00000000 00000000 00000001
| (bitwise or)
3 : 00000000 00000000 00000000 0000011
5 : 00000000 00000000 00000000 0000101
3|5 : 00000000 00000000 00000000 0000111
^ (bitwise xor)
3 : 00000000 00000000 00000000 00000011
5 : 00000000 00000000 00000000 00000101
3^5 : 00000000 00000000 00000000 00000110
1071 0 입력될 때까지 무한 출력하기1
- goto 명령문
goto 이름:
명령은 이름: 이 작성된 곳으로 프로그램의 실행 흐름을 바꾸어 준다.
이름: 과 같이 콜론(:)이 붙어있는 부분을 이름표(label, 레이블/라벨)라고 한다.
레이블은 특별한 선언 없이 사용할 수 있으며 언더바(_)나 영문자로 시작하면 된다.
goto 레이블;
명령을 사용하면 반복되는 부분을 여러 개 자유롭게 만들 수 있다.
goto 명령은 반복실행을 만들어낼 수 있는 가장 간단한 명령이지만,
복잡하게 사용하는 경우, 이해가 어렵고 오류가 생기기 쉽니다. 스파게티코드라고도 한다. - 예시
int n;
reload: //레이블은 콜론( : ) 으로 끝난다.
scanf("%d", &n);
printf("%d", n);
if(n!=0) goto reload; //reload라고 적혀있는 레이블로 실행 이동