프로젝트 오일러 7~8

프로젝트 오일러 7

소수를 크기 순으로 나열하면 2, 3, 5, 7, 11, 13, ... 과 같이 됩니다.
이 때 10,001번째의 소수를 구하세요.
--------------------------------------------------------------------------------------
#include
#include
void main(void)
{
int count=0,i,num=3;

while(count!=10001)
{
for(i=2;i {
if(num%i==0) break; //나눠지면 그 때의 num 값은 아웃!
else if(i==num-1)  //나눠지지 않고 i 값이 num-1 까지 반복문을 돌면
{                         그 값은 조건을 충족시킨 값이므로 count 값을 1 더                                                   한다.
count++;
printf("%d번째 소수는 %d이다.\n",count+1,num);
}
}
num++;
}
}
--------------------------------------------------------------------------------------------
쉽게 생각했다가 못 풀었던 문제. 이 코드는 댓글(http://euler.synap.co.kr/forum_list.php?p=7&pg=20)에서 본 깔끔한 코드다. 우선 if문의 if(num%i==0) break;가 코드를 깔끔하게 할 수 있던 요인인 것 같다. if와 else if 문의 조건을 충족시키지 못한 i 는 반복문을 돌고
if문의 조건을 충족시키면 for문을 빠져나오고 else if문의 조건 또한 참신하다.
창의적으로 생각하자~!!


프로젝트 오일러 8

다음은 연속된 1000자리 숫자입니다 (읽기 좋게 50자리씩 잘라놓음).
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450
여기서 붉게 표시된 71112의 경우 7, 1, 1, 1, 2 각 숫자를 모두 곱하면 14가 됩니다.
이런 식으로 맨 처음 (7 × 3 × 1 × 6 × 7 = 882) 부터 맨 끝 (6 × 3 × 4 × 5 × 0 = 0) 까지 5자리 숫자들의 곱을 구할 수 있습니다.
이렇게 구할 수 있는 5자리 숫자의 곱 중에서 가장 큰 값은 얼마입니까?
-----------------------------------------------------------------------------------------------
#include #include int CHECK_SUM(char*, int, int); int main(void){ char array[2000]="7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";  
int i,BIGGEST,temp,count=0; BIGGEST = CHECK_SUM(array, 0, 4); for(i=1;i<1000 :="" count="" d="" i="" if="" printf="" temp=""> %d\n",BIGGEST,temp); BIGGEST=temp; } } printf("LAST_DEBUG : %d\n",BIGGEST); return 0; } int CHECK_SUM(char* array, int first, int last){ char c_temp[1]; int i; int temp=1; for(i=first;i<=last;i++){ c_temp[0] = array[i]; temp*=atoi(c_temp); } return temp; }
--------------------------------------------------------------------------------
이 문제는 잘 모르겠다. 처음에 저 숫자들을 쪼개서 2차 배열에 넣었다가 엄청 헤맸다. 나중에 더 잘하게 되면 다시 봐야겠다.

댓글

이 블로그의 인기 게시물

윈도우 설치에서 파티션 설정 오류(NTFS)

[exploit writing] 1_스택 기반 오버플로우 (1) First

하둡 설치 오류 정리