나의 첫번째 시도
1. min 부터 max 까지 모든 숫자중에 제곱수를 빼준다.
/*
https://www.acmicpc.net/problem/1016
제곱ㄴㄴ수
M과 N이 주어질 때 M이상 N이하의 자연수 중
어떤 수 X가 1보다 큰 제곱수로 나누어 떨어지지 않을 때,
제곱ㄴㄴ수라고 한다. 제곱수는 정수의 제곱이다. min과 max가 주어지면,
min과 max를 포함한 사이에 제곱ㄴㄴ수가 몇 개 있는지 출력한다.
Writer : Mun Jae In
Date : 2017.12.25
*/
#include <stdio.h>
#include <math.h>
int main(int argc, char * argv[])
{
int min;
long long max;
int cnt=0;
int i;
scanf("%d %lld", &min, &max);
for(i=min,cnt=(int)(max-min)+1; i<=max; i++)
{
if(sqrt((double)i)-(int)sqrt((double)i) == 0)
cnt--;
}
printf("%d",cnt);
}
이렇게 제출하면 틀렸다고 나온다. 아마도 min 과 max 를 다 탐색하려면 시간이 너무 오래걸려서 그런것 같다.
/*
https://www.acmicpc.net/problem/1016
제곱ㄴㄴ수
M과 N이 주어질 때 M이상 N이하의 자연수 중
어떤 수 X가 1보다 큰 제곱수로 나누어 떨어지지 않을 때,
제곱ㄴㄴ수라고 한다. 제곱수는 정수의 제곱이다. min과 max가 주어지면,
min과 max를 포함한 사이에 제곱ㄴㄴ수가 몇 개 있는지 출력한다.
Writer : Mun Jae In
Date : 2017.12.25
*/
#include <stdio.h>
#include <math.h>
int main(int argc, char * argv[])
{
int min;
long long max;
long long cnt=0;
scanf("%d %lld", &min, &max);
if(min>1 && max<=1000000000000 && max-min<=1000000)
{
printf("%lld\n",(max-min+1)-(int)sqrt((long double)max)+(int)sqrt((double)min));
}
if(min==1 && max<=1000000000000 && max-min<=1000000)
{
printf("%lld\n",(max-min+1)-(int)sqrt((long double)max));
}
}
반복문을 사용하지 않고 풀었는데도 틀렸다.... 왜 틀렸지?
제곱수의 배수도 제곱수로 나누어 떨어지기 때문에 틀렸다.
'Computer Science > Algorithm' 카테고리의 다른 글
[Algorithm/C] BOJ.14954 Happy Number (0) | 2018.01.01 |
---|---|
[Algorithm/C] AOJ.WITHDRAWAL(미해결) (1) | 2017.12.26 |
[Algorithm/C] BOJ.1977 완전제곱수 (0) | 2017.12.22 |
Compare RecursiveP with DynamicP (0) | 2017.12.16 |
[Algorithm/C] BOJ.4948 베르트랑 공준 (0) | 2017.12.16 |