Extra Long Factorials (hackerrank)
매우 큰 숫자를 다루기 위한 데이터 타입을 고르고, 곱하기 연산과 출력 연산을 만들면 된다.
다른 연산을 더해야 한다면 클래스화 하는 것도 좋을 수 있지만 이 정도 선에서는 필요가 없는 듯 하다.
출력시 뒷자리들은 앞에 0을 채워넣어 주어야 할 필요가 있다는 것을 잊으면 다 해놓고 틀리게 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
#include <bits/stdc++.h> #define __CUT_AT 10000 using namespace std; void multiplyByN(vector<unsigned>& vecNum, int n) { vector<unsigned> vecTemp; for(unsigned i = 0; i < vecNum.size(); i++) { vecNum.at(i) *= n; } for(unsigned i = 0; i < vecNum.size(); i++) { if(__CUT_AT < vecNum.at(i)) { unsigned u = vecNum.at(i)/__CUT_AT; if(i+1 == vecNum.size()) { vecNum.emplace_back(u); } else { vecNum.at(i+1) += u; } vecNum.at(i) -= u * __CUT_AT; } } } void printoutVectorR(vector<unsigned>& vecNum) { auto it = vecNum.rbegin(); cout << *it; for(++it; it != vecNum.rend(); ++it) { cout << setw(4) << setfill('0') << *it; } cout<< '\n'; } void extraLongFactorials(int n) { vector<unsigned> vecNum; vecNum.emplace_back(n); for(int i = n-1; i > 1; i--) { multiplyByN(vecNum, i); } printoutVectorR(vecNum); } int main() { int n; cin >> n; cin.ignore(numeric_limits<streamsize>::max(), '\n'); extraLongFactorials(n); return 0; } |