요새 스터디하느라 백준 문제풀기를 소홀히 했다..
주말에라도 열심히 해야지
1065번 한수
#include <stdio.h>
int main() {
int m,n,o;//첫째자리 두번째자리 세번째자리수
int k = 99;
int a[1001] ;
for (int i = 1; i < 100; i++) {
a[i] = 1;
} // 99까지의 배열 만들기.
for (int j = 111; j < 1000; j++) {
o = j % 10;
n = (j / 10) % 10;
m = (j / 100) % 10;
if ((o - n) == (n - m)) {
a[j] = 1;
}
}// 한수의 배열을 만듦. --> 한수라면 자리수가 1이 되도록함.
int num, result;
scanf("%d", &num);
if (num <= 99) {
result = num;
}
else if (num<=110){
result = 99;
}
else {
result = 99;
for (int h = 111; h <= num; h++) {
if (a[h] == 1) {
result++;
}
}
}
printf("%d", result);
return 0;
}
예제로 나와있는 것에서는 문제점이 발견되지 않는다. 그런데 계속 틀렸습니다가 뜨니... 일단 질문게시판에 반례를 찾아달라고 올려놓았으나 나로써는 반ㄹㅖ를 찾기가 힘들다.. ㅠㅠ
11720번 숫자의 합
#include <stdio.h>
int main() {
int num,t;
int result = 0;
int many;
scanf_s("%d", &many);
scanf_s("%d", &num);
while (num != 0) {
t = num % 10;
num /= 10;
result += t;
}
printf("%d", result);
return 0;
}
간단한 숫자의 합이지만 25자리의 수가 들어와버리면 막히고 만다.
일반적인 정수자료형에 담기는 너무 크기 때문이다. 그렇다면.. 롱롱..?
롱롱으로 고쳐서 해보았으나 여전히 똑같은 결과가 나온다..
답은 아스키코드를 이용한 문자열끼리의 연산에 있었다.
#include <stdio.h>
int main(void) {
int n, sum = 0;
scanf("%d", &n);
char num[n];
scanf("%s", num); //%c 문자 %s 문자열
for (int i = 0; i < n; i++) sum += num[i] - '0';
//문자열끼리의 사칙연산이다. 문자열 0 == 48, 문자열 1 ==49, 문자열 2 ==50이다.
//따라서 문자열 숫자 - 문자열 0 을 하게 되면 본래의 정수가 나오게 된다!!!!!
printf("%d", sum);
}
예를 들어
문자열 "1"-"0" ==> 아스키코드로 변환했을 때 49-48로 1이 나오게 되는 것이다.
대박!