BbaDdo :: BbaDdo

/*

 by ESP bbaddo 3.April.2021 

 입력범위 1 ~ 18,446,744,073,709,551,615 unsigned long long

*/

#include <stdio.h>

#include <iostream>

#include <sstream> 

#include <string>

 

using namespace std;

 

template <typename T>  //소수점12자리까지 문자열로 변환

string to_string_with_precision(const T value, const int n = 12)

{

ostringstream out;

out.precision(n);

out << std::fixed << value;

return out.str();

}

 

template <typename T>  //천단위 쉼표, 여기서 unsigned long long 만 쓰지만 템플레이트로 구현

string sep_thousands(const T value)

{

const char* locale_name = "english";

#ifdef WINDOWS

locale_name = "korean";

#endif

 

ostringstream out;

out.imbue(locale(locale_name));

out << value;

return out.str();

}

 

string checkPrimeNumber(unsigned __int64);

 

 

 

int main()  //실행 ctrl + F5

{

unsigned __int64 inputNumber = 0;

 

while(true)

{

cout << "******* 소수 prime number 판별기 *******" << endl;

cout << "입력 : ";

 

cin >> inputNumber;

//cout << inputNumber << endl; 

if (cin.fail()) {

//입력범위 1 ~ 4,294,967,295 unsigned int

//__int64(long long) -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807  unsigned long long  0 ~18446744073709551615

cout << "입력범위는 1 ~ 18,446,744,073,709,551,615 입니다." << endl; 

cin.clear();

cin.ignore(INT_MAX, '\n');  //clear all in the cin buffer --->문자 입력오류시

}

else if (0 == inputNumber)

{

cout << "종료합니다.\n" << endl; 

break;

}

else

{

cout << checkPrimeNumber(inputNumber) << endl;

}

 

inputNumber = 0;

cout << "\n0:종료\n" << endl;

}

 

system("PAUSE"); //실행 ctrl + F5

return 0;

}

 

 

 

string checkPrimeNumber(unsigned __int64 inputNumber)

{

unsigned __int64 sq = (unsigned __int64)sqrt(inputNumber);  //루트 중간값까지만 확인

if (0 == sq % 2) sq += 1;  //중간값이 짝수일 경우 큰홀수로 변경

//cout << "ROOT: " << sq << endl;

 

string str = "";

unsigned __int64 countNumber = 1;

 

if (1 == inputNumber) //입력숫자 1

{

str = to_string(inputNumber) + "은 소수가 아닙니다. ";

}

else if (3 == inputNumber) //입력숫자 3

{

str = to_string(inputNumber) + " 소수입니다! " + to_string(countNumber) + "루프 " + to_string_with_precision<double>((double)countNumber / inputNumber * 100) + "%";

}

else

{

if (0 == inputNumber % 2)  //짝수 일때

{

if (2 == inputNumber)  //입력숫자 2

{

str = to_string(inputNumber) + " 소수입니다! " + to_string(countNumber) + "루프 " + to_string_with_precision((double)countNumber / inputNumber * 100) + "%";

}

else  //나머지 짝수

{

str = sep_thousands<unsigned __int64>(inputNumber) + " 소수가 아닙니다. " + to_string(inputNumber / 2) + " X " + "2" + " = " + to_string(inputNumber);

}

}

else  //홀수 일때 215468423

{

for (unsigned __int64 i = 3; i <= sq; i += 2) //3이상 홀수만 확인

{

if (0 == inputNumber % i) //소인수 분해될때

{

str = sep_thousands(inputNumber) +" 소수가 아닙니다. " + to_string(inputNumber / i) + " X " + to_string(i) + " = " + to_string(inputNumber);

break;

}

else //루트 중간수 끝까지 확인했지만 소인수 분해가 안될때 --> 소수 

{

if (sq == i)

{

str = sep_thousands(inputNumber) +" 소수입니다! " + sep_thousands(countNumber) +"루프 " + to_string_with_precision((double)countNumber / inputNumber * 100) + "%";

break;

}

}

++countNumber;

}

}

}

return str;

}

'cocos2d-x' 카테고리의 다른 글

cocos2d-x 2.2.4 & 3.x : false positive, memory leaks  (0) 2015.05.11
1 2 3 4 ··· 14 

카운터

Total : / Today : / Yesterday :
get rsstistory!