티스토리 뷰
1부터 n까지의 자연수를 차례로 더하여 구해진 값을 삼각수라고 합니다.
예를 들어 7번째 삼각수는 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28이 됩니다.
이런 식으로 삼각수를 구해 나가면 다음과 같습니다.
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
이 삼각수들의 약수를 구해봅시다.
1: 1
3: 1, 3
6: 1, 2, 3, 6
10: 1, 2, 5, 10
15: 1, 3, 5, 15
21: 1, 3, 7, 21
28: 1, 2, 4, 7, 14, 28
위에서 보듯이, 5개 이상의 약수를 갖는 첫번째 삼각수는 28입니다.
그러면 500개 이상의 약수를 갖는 가장 작은 삼각수는 얼마입니까?
이것은 두가지 풀이가 있다. 처음꺼는 등차수열의 합을 이용한 무식한 풀이 방법이고, 다음꺼는 N = a^p*b^q*c^r 으로 소인수분해 되는 N의 약수의 개수 (p+1)(q+1)(r+1) 을 이용한 풀이 방법이다.
Sol 1) 솔루션이라기에는 비참한 코드
#include <stdio.h>
int main (void){
int trisum = 0; int firstNum = 1;
int lastNum = 0;
int i,j;
int count=0; int divisor = 0;
for(i=1;;i++){
count++; lastNum = i;
trisum = (firstNum+lastNum)*count/2;
j=1; divisor=0;
for(j=1; j<=trisum ; j++){
if(trisum%j == 0){
printf("%d ", j);
divisor++;
}
}
printf("\n%d의 약수의 갯수 : %d\n",trisum,divisor );
printf("\n");
if(divisor == 500)
break;
}
return 0;
}
Sol2 )
#include <stdio.h>
int count (int n){
int i, j, result =1;
for(j=0; (n&1) == 0; j++, n>>=1);
result *=(j+1);
for(i=3; n>=i ; i +=2){
for(j=0; n%i==0 ; n/=i, j++);
result *=(j+1);
}
return result;
}
int main (){
int tri, i;
for (tri=3, i=3; count(tri) <500; tri+=i++);
printf("%d", tri);
return 0;
}
'알고리즘 > 오일러 프로젝트' 카테고리의 다른 글
오일러 프로젝트 16번 (0) | 2016.05.06 |
---|---|
오일러 프로젝트 14번 (0) | 2016.05.02 |
오일러 프로젝트 11번 (0) | 2016.04.23 |
오일러 프로젝트 10번 (0) | 2016.04.22 |
오일러 프로젝트 8번 (0) | 2016.04.17 |
- Total
- Today
- Yesterday
- 오일러 프로젝트 14번
- 패킷
- CBrush
- 비손실 압축
- tipsoft
- tipssoft
- 허프만 알고리즘
- TIPS강좌
- 오일러 프로젝트 12번
- 약수 500개
- 오일러 프로젝트 10본
- 헤더
- 키보드 메시지 이벤트
- 팁스강좌
- 서버
- MFC
- arp
- 오일러 프로젝트 8번
- 2의 1000승
- 실행 압축
- 화투이미지맞추기
- 오일러 프로젝트 13
- 오일러
- 오일러 프로젝트 11번
- 오일러 프로젝트 16번
- 이미지게임
- Omok
- tipsr강좌
- 와이어샤크
- Tips
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |