본문 바로가기
알고리즘 문제 & 프로그래밍/C++

[C++]프로젝트 오일러 20번 문제&풀이 (100! 의 자릿수를 모두 더하면?)

by 달슬 2020. 12. 4.
반응형

문제 20번

n! 이라는 표기법은 n × (n − 1) × ... × 3 × 2 × 1을 뜻합니다.

예를 들자면 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800 이 되는데,
여기서 10!의 각 자릿수를 더해 보면 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27 입니다.

100! 의 자릿수를 모두 더하면 얼마입니까?

 

접근방법

1. 파이썬으로 하면 간단하겠으나, C++는 자료형을 고려해서 풀어야 하기 때문에 조금 번거롭다.

2. 충분히 긴 벡터(numVector(200))를 만들고, 첫번째 자리에 1을 넣는다.

3. 벡터의 각 요소에 각 자리수가 들어가도록 할건데, 숫자를 그대로 넣고 10으로 나눠서 나머지는 남기고, 몫은 한칸씩 옆으로 보내 더해준다.(1의자리수가 numVector[0]에, 10의 자리수가 numVector[1]에 담기는 방식)

4. 101을 예시로 들어보면 10으로 나눴을 때 나머지(1)를 첫번째 자리(numVector[0])에 남기고, 몫(10)을 그 다음칸(numVector[1])으로 넘긴다. 두번째 자리(numVector[1])도 10보다 크거나 같으므로, 10으로 나눠보면 0을 두번째 자리(numVector[1])에 남기고, 몫(1)을 세번째 자리(numVector[2])로 넘긴다.

5. 위와 같은 방식으로 1~100의 모든 수를 곱하면서 벡터의 각 요소가 각 자리수를 담도록 하면 된다.

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	vector<int> numVector(200);

	numVector[0] = 1;
	int sum = 0;

	for (int num = 100; num > 1; num--)
	{
		for (int n = 0; n < numVector.size(); n++)
		{
			numVector[n] *= num;
			//cout << numVector[n] << " ";
		}
		//cout << endl;

		for (int n = 0; n < numVector.size() - 1; n++)
		{
			if (numVector[n] >= 10)
			{
				numVector[n + 1] += (int)(numVector[n] / 10);
				numVector[n] = numVector[n] % 10;
			}
		}

		/*for (int n = 0; n < numVector.size(); n++)
		{
			cout << numVector[n] << " ";
		}
		cout << endl;
		cout << endl;*/
	}

	for (int n = 0; n < numVector.size(); n++)
	{
		sum += numVector[n];
	}

	cout << "Answer is : " << sum << " " << endl;

	return 0;
}

참고

https://github.com/mannlim/ProjectEuler

 

mannlim/ProjectEuler

How to solve Project Euler using by C++. Contribute to mannlim/ProjectEuler development by creating an account on GitHub.

github.com

반응형

댓글