#include <stdio.h> bool SN[10001]; int d(int n) { int dn=n; if(n>=10000) { dn += n/10000; n %= 10000;} if(n>=1000) { dn += n/1000; n %= 1000;} if(n>=100) { dn += n/100; n %= 100;} if(n>=10) {dn += n/10; n %= 10;} return dn += n; } int main() { for(int i=1; i<10001; i++) { SN[d(i)]=1; if(!SN[i]) printf("%d\n",i); } } |
#include <stdio.h> int d(int n) { int dn=n; if(n>=10000) { dn += n/10000; n %= 10000;} if(n>=1000) { dn += n/1000; n %= 1000;} if(n>=100) { dn += n/100; n %= 100;} if(n>=10) {dn += n/10; n %= 10;} return dn += n; } int main() { bool SN[10001]; for(int i=1; i<10001; i++) { SN[d(i)]=1; if(!SN[i]) printf("%d\n",i); } } |
지역변수 전역변수 차이인데 밑에는 런타임 오류
캐시메모리 히트에 관련된 문제라고 함.
n은 d(n)의 생성자이므로, SN[d(i)]는 i를 생성자로 갖는 어떤 수에 대한 flag를 저장하는 배열.
생성자가 있다 없다만 표하면 되므로 bool로 선언
SN[i]가 0이면 생성자가 없으므로 그 값을 출력
배열 크기에 대해서는 오버플로우가 없는 건가?
for(int i=1; i<10001; i++) { if(d(i)<=10000) SN[d(i)]=1; if(!SN[i]) printf("%d\n",i); } |
SN[d(i)]값에 대해 설정할 때, d(i)가 10001보다 작은 값을 가질 때만 가능하도록 하면 틀렸다고 뜸. -> SN값을 처음에 초기화 해주지않아서 쓰레기값때문에 틀린 결과값 출력됨
#include <stdio.h> int d(int n) { int dn=n; if(n>=10000) { dn += n/10000; n %= 10000;} if(n>=1000) { dn += n/1000; n %= 1000;} if(n>=100) { dn += n/100; n %= 100;} if(n>=10) {dn += n/10; n %= 10;} return dn += n; } int main() { bool SN[10001]={0}; for(int i=1; i<10001; i++) { if(d(i)<=10000) SN[d(i)]=1; if(!SN[i]) printf("%d\n",i); } } |
VS로 돌리면 오히려 if (d(i) <= 10000) 조건이 없으면
Run-Time Check Failure #2 - Stack around the variable 'SN' was corrupted.
이 뜸!!!!
'알고리즘 문제 풀이 > 1DP_과제(~180615)' 카테고리의 다른 글
171012_2163_초콜릿 자르기 (0) | 2017.10.12 |
---|---|
171012_11052_붕어빵 판매하기 (0) | 2017.10.12 |
171010_1085_직사각형에서 탈출 (0) | 2017.10.10 |
20171009_2156_포도주 시식 (0) | 2017.10.09 |
20171009_1932_숫자 삼각형 (0) | 2017.10.09 |