어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.
출력
첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.
나의 풀이
#include <stdio.h>
int hansu(int);
int main(void){
int input, i, result, count = 0;
scanf("%d", &input);
for (i = 1; i <= input; i++)
{
result = hansu(i);
result == 1 ? count++ : 0;
}
printf("%d", count);
return 0;
}
int hansu(int i)
{
int a, b, c;
if (i < 100)
return 1;
else{
a = i / 100; // 100의 자리
i %= 100;
b = i / 10; // 10의 자리
i %= 10; // 1의 자리
c = i;
if ((c - b) == (b - a)) // 각 수가 등차수열을 이룰 때
return 1;
else
return 0;
}
}
다른 사람의 풀이 (재귀함수 이용)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int n, cnt=0;
int hansu(int n) {
if(n < 100){ // 100 미만은 한수
cnt++;
if(n == 1) // 100 미만 중에서 1이 됐을 때 재귀 종료
return cnt;
}
//100이상은 자릿값 검사
else {
int d = n%10 - n/10%10; // 일의 자리에서 십의 자리를 뺀 값(특정 자리 - 바로 앞 자리)로 기준 공차 설정
for(int num = n/10; num >= 10; num /= 10){
// 초기 값을 입력값/10으로 설정해서 "특정 자리"를 십의 자리부터 시작, 한 자리씩 앞으로
// 가장 앞의 두 자리만 남을 때까지 반복
if(num%10-num/10%10 != d){ // 공차가 일정하지 않은 경우 1 줄이고 반복 중단
--cnt;
break;
}
}
++cnt; // 등차수열을 이룬다면 반복 도중 -1이 되지 않으므로 +1, 위배된다면 +0
}
return hansu(n-1);
}
int main() {
scanf("%d", &n);
printf("%d", hansu(n));
return 0;
}
'C' 카테고리의 다른 글
[8] 백준 3052번 서로 다른 나머지 개수 구하기 (0) | 2022.06.20 |
---|---|
[7] 백준 2577번 숫자의 개수 문제 (0) | 2022.06.20 |
[4] 백준 4673번 셀프넘버 출력 (0) | 2022.06.20 |
[3] 백준 2562번 최댓값 출력 (0) | 2022.06.19 |
[2] 백준 오븐의 요리 완료 시간 구하기 문제 (0) | 2022.06.19 |