untitleSSU
#include< iostream >
#include< string >
#include< math.h >
using
namespace
std;
//수열에 포함되어있는지 체크하는 함수.
char
check(
double
num);
int
main() {
test, num;
//결과가 한줄에 출력됨으로 string에 결과 저장하기
string result=
""
;
cin >> test;
while
(test--) {
cin >> num;
result += check(num);
result +=
" "
}
cout << result;
return
0;
num) {
//문제의 수열에 1이 포함되어 있는 자리수가 계차수열을 이룸.
//a(n항) = 1 + n(n-1)/2 로 나타남. 함수로 넘어오는 num 값이 a(n항)의 결과값이 될 수 있으면 계차수열에 포함되는것이다.
--num *= 2;
//num = a(n항)이라 가정할 때 n 구하기. 제곱근을 써서 n(n-1)을 충족할 수 있는 n을 구한다.
temp =
sqrt
(num);
if
(num/temp - temp == 1) {
'1'
else
{
'0'
풀이 :
자리수가 계차수열을 이룸으로 자리수를 구하는 수열을 계산한다.
그리고 검사할 자리수가 an이라고 가정하면 만족하는 n을 찾아 검사해야하는데, 여기서 한번에 검사할 수 있게 제곱근을 이용해서 n-1을 구한다. (왜냐면 (자리수-1)*2를 제곱근하면 소수점이 나오는데 n-1과 n 사이의 수가 나온다 int로 저장하면 n-1의 값이 저장됨..)
코드에서 유의할 점은 num을 n-1로 나눠주는 값을 double로 해줘야 한다는 점. int로 넘길 시 오차범위가 너무 커져 계산 오류가 난다.
22222가 그랬음. ㅎㅎ...
참고자료 : 계차수열
* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.