티스토리 뷰
/* * invaildCounter.c * * Created on: 2014. 10. 8. * Author: YoWu (uyu423@gmail.com) * IDE: Eclipse Luna (gcc 4.8.2) */ #define _CRT_SECURE_NO_WARNINGS #include "stdio.h" int main(void) { int halflife2; //input value int gordon = 1, freeman = 0; int gordon_freeman = 0; int bbaru; //temp value int combine = 10; //combine = combine * 10; int smg1[10]; //save array value by halflife2 int ar2 = 0; //smg1 counter int i = 0; scanf("%d", &halflife2); bbaru = halflife2; //input halflife2 to smg1 array while (bbaru) { smg1[i] = bbaru % combine; bbaru = bbaru / combine; ar2++; i++; } //calculate for (i = 0; i < ar2; i++) { if (smg1[i] >= 4) { gordon_freeman = gordon_freeman + gordon + (freeman * (smg1[i] - 1)); } else { gordon_freeman = gordon_freeman + (freeman * smg1[i]); } freeman = gordon + (freeman * 9); gordon = gordon * 10; } printf("%d\n", halflife2 - gordon_freeman); return 0; }
(변수명이 저 모양인 것은 최근에 하프라이프2를 다시 했는데 재밌어서 그렇다. 양해 바랍니다.)
0~9 까지의 4의 갯수 = 1개
0~99까지의 4의 갯수 = 9개(4, 14, 24, 34, 54, 64, 74, 84, 94) + 40~49(10개) = 19개
0~999까지의 4의갯수 - 19개 * 9 + 100개
이런 식으로 각 자리수에 포함된 4의 갯수를 뽑을 수 있는 규칙이 발견된다.
처음 입력 값 (halflife2)에서 구한 4의 갯수(gordon_freeman)을 빼면 원래 값이 나온다.
(14. 11. 15 추가) 그런데 교수님께서 올려주신 모법 답안은 다음과 같다.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int m; char n[12]; int main() { scanf("%s", n); for (char* p = n; *p; ++p) m = m * 9 + (*p > '4' ? (*p) - '1' : (*p) - '0'); printf("%d", m); return 0; }
멘붕
'컴퓨터공학' 카테고리의 다른 글
간단한 단방향 연결 리스트(Linked List) 예제 및 설명 (C 언어) (0) | 2016.04.15 |
---|---|
스택(Stack) 활용 미로 길찾기 프로그램 (C lang) (1) | 2015.04.14 |
[UNIX / LINUX] fread, fwrite 함수 원형, 예제 (0) | 2014.10.05 |
[UNIX / LINUX] 저수준 파일 입출력(open, write, read) 예제 (0) | 2014.10.05 |
시스템 호출(System Call)과 라이브러리 함수(Library Function) 차이 (0) | 2014.09.24 |
getopt() 함수 예제 (0) | 2014.09.24 |
[알고리즘 연습문제] Letter Bank (0) | 2014.09.22 |