전부 C++로 풀었습니다.
2012.12.3에 글을 합쳤습니다. 문제는 100개 단위(...)로 묶기로 했어요.
2012.6.20
int main()
{
int i, s=0;
for(i=1; i<1000; i++)
{
if(i%3==0 || i%5==0)
s+=i;
}
cout<<s<<"\n";
return 0;
}
2012.6.20
int main()
{
int a=1, b=1, c=0;
int s=0;
while(b<4000000) //ㅁ ㅁ ㅁ 칸에 각각 a,b,c를 저장한다고 생각
{
c=a+b; //세번째 칸에 다음 수열값 저장
a=b;
b=c; //한 칸씩 "민다".
if(a%2==0)
s+=a;
}
cout<<s<<"\n";
return 0;
}
2012.6.21?
int main()
{
__int64 N=600851475143L; //이런 건 첨 써본다 -_-;
int i=1;
while(N!=1)
{
i++;
while(N%i==0)
{
N/=i; //N이 소수 i의 배수이면 그 배수가 아니게 될 때까지 나눈다.
} //그리고 i가 합성수일땐 그 이하의 소수 인자로는 모두 나눠버렸으니 나머지가 0이 되지 않는다.
}
cout<<i;
return 0;
}
2012.6.21?
이 풀이는 정직하지 못합니다. 세자리 수 두개의 곱 중 여섯자리가 되는 수만 찾았거든요. 좀 더 정직한 프로그램을 만들어야겠습니다. [각주:1] [각주:2]
int main()
{
int i,j;
int y=0, z=0;
int max=0;
for(i=100; i<1000; i++)
{
for(j=100; j<i+1; j++)
{
if(i*j/100000 != i*j%10) continue;
else y=(i*j%100000)/10;
if(y/1000 != y%10) continue;
else z=(y%1000)/10;
if(z/10 != z%10) continue;
else cout<<i*j<<"\n";
if(i*j>max) max=i*j;
else continue;
}
}
cout<<max<<"\n";
return 0;
}
2012.6.22?
조건을 만족하는 수를 찾는게 아니라 만듭니다. 수학적으로 이런 수는 20 이하의 최대의 소수 p의 거듭제곱들의 곱이라는 것을 알 수 있는데, 이것을 이용했습니다.
int main()
{
int i, j=1, p=1;
for(i=2; i<21; i++)
{
j=i; // j=i^1
while(j<21)
{
if(p%j!=0)
p*=i; //j를 곱하는 것이 아니라 i를 곱해야 한다.
j*=i; //j의 차수를 키워나간다.
}
j=1; //이러지 않으면 나중에 다른 수에 대해 위 짓을 할려고 할 때, j가 21보다 크기 때문에 아무것도 안하게 된다.
} //위 경우는 소수에 대해서만 '그 짓'을 하게 된다.
//합성수의 경우 분명 그것을 소인수분해할 때 나오는 소수들의 지수가 곱에 있는 소수의 지수보다 분명 더 작을 것이기 때문이다.
cout<<p<<'\n';
return 0;
}
2012.6.23
잘 알려진 공식을 쓸 수도 있지요... 그러나 그러느니 계산기 쓰고 말지 -_-;
int main()
{
int i, sqsu=0, susq=0;
for(i=1; i<=100; i++)
{
sqsu+=i*i;
}
for(i=1; i<=100; i++)
{
susq+=i;
}
cout<<susq*susq -sqsu<<"\n";
return 0;
2012.6.25?
문제 해석을 잘못해서 괜히 어렵게 풀려고 했습니다. ('연속한 다섯 자리수'를 '연속한 다섯 자연수'로 알아보고 어떻게 큰 수를 표현할지 생각하고 있었습니다... orz)
}
2012.6.27
int main()
{
int num[20][20];
int max=0;
int i,j;
freopen("Number.TXT", "r", stdin);
for(i=0; i<20; i++)
{
for(j=0; j<20; j++)
{
cin>>num[i][j];
}
}
for(i=0; i<17; i++) // 가로방향
{
for(j=0; j<20; j++)
{
if(num[i][j]*num[i+1][j]*num[i+2][j]*num[i+3][j]>max)
{
max=num[i][j]*num[i+1][j]*num[i+2][j]*num[i+3][j];
}
}
}
for(i=0; i<20; i++) // 세로방향
{
for(j=0; j<17; j++)
{
if(num[i][j]*num[i][j+1]*num[i][j+2]*num[i][j+3]>max)
{
max=num[i][j]*num[i][j+1]*num[i][j+2]*num[i][j+3];
}
}
}
for(i=0; i<17; i++) // 오른쪽아래 대각선방향
{
for(j=0; j<17; j++)
{
if(num[i][j]*num[i+1][j+1]*num[i+2][j+2]*num[i+3][j+3]>max)
{
max=num[i][j]*num[i][j+1]*num[i][j+2]*num[i][j+3];
}
}
}
for(i=1; i<17; i++) // 오른쪽위 대각선방향
{
for(j=4; j<20; j++)
{
if(num[i][j]*num[i+1][j-1]*num[i+2][j-2]*num[i+3][j-3]>max)
{
max=num[i][j]*num[i+1][j-1]*num[i+2][j-2]*num[i+3][j-3];
}
}
}
cout<<max<<"\n";
return 0;
}
2012.6.27?
int main()
{
int n,i, e=0;
int tr=3, dnum=1, cpy=3;
for(n=3; dnum<=500; n++)
{
tr+=n;
if(tr%2!=0) continue; // 관찰을 통해 구하려는 삼각수가 짝수라고 생각했습니다. 그런데 증명은 아직 못하겠네요.
// 참고로 이 항을 넣을 때 걸리는 시간은 78㎲, 안 넣을 시는 171㎲가 걸렸습니다.
dnum=1;
cpy=tr;
for(i=2; cpy!=1; i++)
{
while(cpy%i==0)
{
cpy/=i;
e++;
}
dnum*=e+1;
e=0;
}
}
cout<<tr<<"\n";
return 0;
}
2012.6.27~7.8 (?)
int main()
{
int num[100][7], ans[7]={0,0,0,0,0,0,0}; // 초기화 안해서 피봤습니다. 하마터면 프로젝트 오일러에 질릴 뻔했어요.
int i,j,k;
freopen("Number.txt", "r", stdin);// 2자리, 8자리, 8자리, ...로 끊어주는 노가다는 귀찮았습니다.
for(i=0; i<100; i++)
{
for(j=0; j<7; j++)
{
cin>>num[i][j];
}
}
for(i=0; i<100; i++)
{
for(j=0; j<7; j++)
{
ans[j]+=num[i][j];
}
for(k=6; k>0; k--)
{
while(ans[k]>100000000) //자릿수를 올린다.
{
ans[k]-=100000000;
ans[k-1]++;
}
}
}
cout<<ans[0]<<" "<<ans[1]<<"\n";
return 0;
}
2012.6.27~7.8 (?)
13번도 overview PDF가 없더니 이것도 없네요 '-'. '쉽다고' 그러는건가.
int main()
{
__int64 cpy=1; // 얘로 안했더니 113383에서 무한루프 타고있더군요. (오버플로우땜시 음수가 되어서 그렇습니다)
int n, len=0, max=0, mnum=0;
for(n=2; n<1000000; n++)
{
len=0;
cpy=n;
while(cpy!=1)
{
cpy=(cpy%2==0)? cpy>>1: 3*cpy+1;
len++;
}
if(len>max)
{
max=len;
mnum=n;
}
}
cout<<mnum<<endl;
return 0;
}
2012.6.27~7.8 (?)
그냥 이항계수 구하기. 쉬운걸 왜 3일동안 (귀차니즘땜시 정확한 풀이로 접근하지 못한채) 걸린건지..
int main()
{
int i;
__int64 ans=1;
for(i=1; i<21; i++)
{
ans*=41-i;
ans/=i;
}
printf("%I64d \n", ans); // 얘쓰는게 그렇게 힘들었어요 -_-;
return 0;
}
2012.7.8
점점 나는 단순무식하게 몇가지 방법으로만 문제를 풀고 있다. 신기한건 이 코딩이 1㎲도 안걸리는 코딩이라는 것.
int main() //귀차니즘 발동해서 void로 하려고 했는데 꼭 int로 반환하라고 하는 컴파일러도 있더군요.
{
int dig[50]={1}, sum=0;
int i,j;
for(i=0; i<1000; i++)
{
for(j=0; j<50; j++)
{
dig[j]<<=1;
}
for(j=0; j<50; j++)
{
while(dig[j]>10000000)
{
dig[j]-=10000000;
dig[j+1]++;
}
}
}
for(j=0; j<50; j++)
{
if(dig[j]==0) continue;
while(dig[j]!=0)
{
sum+=(dig[j]%10);
dig[j]/=10;
}
}
cout<<sum<<endl;
return 0;
}
2012.7.9
코딩보다 영어가 더 어려웠던 문제. 은근히 내가 수사를 잘못 알고 있는게 많았다.
void Det100(int m); //백의 자릿수 확인
void Det10(int m); //십의 자릿수 확인
void Det10s(int m); //11, 12, ..., 19같이 특별한 경우 확인
void Det1(int m); //일의 자릿수 확인
int let=11; //one thousand의 글자수
int main()
{
int i;
int mid=0;
for(i=1; i<1000; i++)
{
mid=(i%100)/10; //mid는 십의 자릿수
Det100(i/100);
Det10(mid);
Det10s(i%100);
if(mid==1) continue;
Det1(i%10);
}
cout<<let<<endl;
return 0;
}
void Det100(int m) //백의 자릿수를 판별하는 함수
{
switch(m)
{
case 0:
break;
case 1:
let+=3+7+3;
break; // one hundred and
case 2:
let+=3+7+3; // two hundred and
break;
case 3:
let+=5+7+3; // three hundred and
break;
case 4:
let+=4+7+3; // four hundred and
break;
case 5:
let+=4+7+3; // five hundred and
break;
case 6:
let+=3+7+3; // six hundred and
break;
case 7:
let+=5+7+3; // seven hundred and
break;
case 8:
let+=5+7+3; // eight hundred and
break;
default:
let+=4+7+3; // nine hundred and
}
}
void Det10(int m) //십의 자릿수를 판별하는 함수.
{
switch(m)
{
case 0:
break;
case 1: // 1인 경우는 나중에 따로 다룬다.
break;
case 2: // twenty
let+=6;
break;
case 3: // thirty
let+=6;
break;
case 4: //forty
let+=5;
break;
case 5: //fifty
let+=5;
break;
case 6: //sixty
let+=5;
break;
case 7: //seventy
let+=7;
break;
case 8: //eighty
let+=6;
break;
default: //ninety
let+=6;
}
}
void Det10s(int m)
{
switch(m) //십의 자리가 1인 경우
{
case 0:
let-=3; // 위에서 and까지 미리 더해버렸기 때문에 빼줘야 한다.
break;
case 10: //ten
let+=3;
break;
case 11: //eleven
let+=6;
break;
case 12: //twelve
let+=6;
break;
case 13: //thirteen
let+=8;
break;
case 14: //fourteen
let+=8;
break;
case 15: //fifteen
let+=7;
break;
case 16: //sixteen
let+=7;
break;
case 17: //seventeen
let+=9;
break;
case 18: //eighteen
let+=8;
break;
case 19: //nineteen
let+=8;
break;
default:
break; // 이 switch문은 백의 자릿수가 20 미만인 특수한 경우만 다룬다.
}
}
void Det1(int m)
{
switch(m) //일의 자릿수
{
case 0:
break;
case 1:
let+=3;
break;
case 2:
let+=3;
break;
case 3:
let+=5;
break;
case 4:
let+=4;
break;
case 5:
let+=4;
break;
case 6:
let+=3;
break;
case 7:
let+=5;
break;
case 8:
let+=5;
break;
default:
let+=4;
}
}
2012.7.10?
단순무식한 방법을 썼는데 시간이 얼마 안걸린다. 신기함. 그런데 단무지하게 풀 생각을 3일동안 했다는거... -_-;
int main()
{
int tri[15][15]={
{75},
{95, 64},
{17, 47, 82},
{18, 35, 87, 10},
{20, 04, 82, 47, 65},
{19, 1, 23, 75, 3, 34},
{88, 2, 77, 73, 7, 63, 67},
{99, 65, 4, 28, 6, 16, 70, 92},
{41, 41, 26, 56, 83, 40, 80, 70, 33},
{41, 48, 72, 33, 47, 32, 37, 16, 94, 29},
{53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14},
{70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57},
{91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48},
{63, 66, 04, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31},
{4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23}
};
int trs[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, trsum=0;
int sum=0, max=0;
int j, idx=0;
while(trsum!=15)
{
trsum=0;
trs[0]++;
for(j=0; j<15; j++) // trs를 하나하나 다 세기 위한 방법. 2진법에서 자리수 올리는 것과 유사한 방법을 씀.
{
if(trs[j]>1)
{
trs[j+1]++;
trs[j]=0;
}
}
for(j=0; j<15; j++) // trs={1,1,1,...,1,1}이 되면 경우의 수 세기를 중단함.
{
trsum+=trs[j];
}
for(j=0; j<15; j++) // 이제 무식하게 경우의 수 따지기.
{
sum+=tri[j][idx];
idx+=trs[j]; // j열에서 trs[j]가 0이면 왼쪽 수로, 1이면 오른쪽 수로 이동하여 합함.
}
if(sum>max) max=sum;
sum=0;
idx=0;
}
cout<<max<<endl;
return 0;
}
2012.7.11?
1901년 1월 1일은 화요일입니다.
int main()
{
int nmth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int smth[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int fday=2, num=0;
int y,m;
for(y=1901; y<2001; y++)
{
if((y%4==0 && y%100!=0) || (y%400==0)) //윤년
{
for(m=0; m<12; m++)
{
fday+=smth[m];
fday%=7;
if(fday==0) num++;
}
}
else //평년
{
for(m=0; m<12; m++)
{
fday+=nmth[m];
fday%=7;
if(fday==0) num++;
}
}
}
cout<<num<<endl;
return 0;
}
2012.7.12?
int main()
{
int dig[30];
int sum=0;
int i,j;
dig[0]=1;
for(j=1; j<30; j++)
{
dig[j]=0;
}
for(i=2; i<101; i++)
{
for(j=0; j<30; j++)
{
dig[j]*=i;
}
for(j=0; j<29; j++)
{
while(dig[j]>=1000000) //등호 넣는것 땜시 고생좀 했습니다. 머리쓰기 귀찮아져서 실험으로 발견... -_-;
{
dig[j]-=1000000;
dig[j+1]++;
}
}
cout<<i<<endl;
}
for(j=0; j<30; j++)
{
while(dig[j]!=0)
{
sum+=dig[j]%10;
dig[j]/=10;
}
}
cout<<sum<<endl;
return 0;
}
2012.7.13
2초 걸렸습니다. [각주:5]
2012.12.5
#include <iostream>
#include <string>
using namespace std;
#define NAME_COUNT 5163
void bubble_sort(char param[NAME_COUNT][20])
{
int i,j,k;
char tmp[20]="";
for(i=0; i<NAME_COUNT-1; i++)
{
for(j=0; j<NAME_COUNT-i-1; j++)
{
for(k=0; param[j][k]!=0; k++)
{
if (param[j][k] < param[j+1][k]) break;
else if (param[j][k] == param[j+1][k]) continue;
else
{
strcpy(tmp, param[j]); //진즉 이거 쓸걸; 포인터 쓴 복잡한 아이디어 쓰다가 뭔꼴이람;
strcpy(param[j], param[j+1]);
strcpy(param[j+1], tmp);
break;
}
}
}
}
}
void main()
{
char name[NAME_COUNT][20]; //20글자를 안넘는다는 보장은 어떻게 하냐구요? 때려맞췄습니다;
int point=0;
__int64 sum=0;
int i,j;
freopen("names.TXT", "r", stdin);
for(i=0; i<NAME_COUNT; i++)
{
cin>>name[i];
}
bubble_sort(name);
for(i=0; i<NAME_COUNT; i++)
{
for(j=0; name[i][j]!=0; j++) //탈출조건이 옳은지는 '실험'으로 검증. 안 채운 부분은 다 null이 들어가더라.
{
point += name[i][j]-64;
}
sum+=(i+1)*point;
point=0;
}
printf("%I64d \n", sum);
cout<<clock()<<endl;
system("pause");
}
2012.12.06
처음 돌렸을때 5초 가량 걸려서 조금 놀랬습니다. 그런데 다시 돌려보니까 83ms.
int sigma(int n) //n==1일땐 2가 나오므로 주의할 것.
{
int i, s=0;
for(i=1; i*i<=n; i++)
{
if(n%i==0)
{
s+=i+(n/i);
if(n/i==i) s-=i;
}
}
return s;
}
void main()
{
int sum=1; //1도 조건을 만족하는 정수임.
int abu[28123]={0}, size=0;
int i, j=0, t;
for(i=2; i<28123; i++)
if(sigma(i)>(i<<1))
abu[size++]=i;
for(i=2; i<28123; i++)
{
for(j=0; j<size; j++)
{
t=i-abu[j];
if((t>0) && (sigma(t)>(t<<1)))
break;
}
if(j==size)
sum+=i;
}
cout<<sum<<endl;
}
2012.12.4
int main()
{
int N=1000000;
int cantor[10]={0}, num[10]={0,1,2,3,4,5,6,7,8,9}, ans[10]={0};
int fact=9*8*7*6*5*4*3*2;
int i, j,k;
N--; //아래 방법으로 하면 맨 앞의 숫자를 0으로 취급하므로, 실제 N번째 수를 구하고싶음 이렇게 해야 함.
for(i=9; i>0; i--) //어차피 cantor[0]=0이므로 0은 제외.
{
cantor[i]=N/fact; //큰 자리수부터 거꾸로 넣고 있음.
N%=fact;
fact/=i;
}
for(i=9; i>=0; i--)
{
ans[i]=num[cantor[i]];
for(j=cantor[i]; j<10; j++) //num에서 ans로 넣은 수를 뺀다.
{
num[j]=num[j+1];
}
}
for(i=9; i>=0; i--)
{
cout<<ans[i];
}
cout<<endl;
return 0;
}
2012.12.4
int main()
{
int a[200]={1, }, b[200]={1, }; // a=F_1 b=F_2. 사족으로 1만 써도 a[0]만 1로 초기화된다더라.
int tmp[200]={0};
int n=2;
int i;
while(b[199]<10000) //10000 이상이면 1000번째 자릿수가 차니까... 끝.
{
for(i=0; i<200; i++)
{
tmp[i]=a[i]+b[i]; //2번 문제 참고.
}
for(i=0; i<200; i++) //처음엔 위에 있는 for문안에 자리수올리는 while문을 넣었는데, 그러면 안 되더라..
//왜냐하면 그렇게 하면 tmp[i]에 올려놓았던 자리수가 사라져버리니까.
//while문을 안에 넣고싶으면 tmp[i]+=a[i]+b[i]로 쓰면 된다.
{
while(tmp[i]>=100000) //자릿수를 올린다. 13번 문제 참고.
{
tmp[i]-=100000;
tmp[i+1]++;
}
}
for(i=0; i<200; i++)
{
a[i]=b[i];
}
for(i=0; i<200; i++)
{
b[i]=tmp[i];
}
n++;
}
cout<<n<<endl;
return 0;
}
int cycle(int n)
{
while(n%2==0) n>>=1;
while(n%5==0) n/=5;
if(n==1) return 0;
int cyc=0;
int nine[170]={0}; // 배열 원소가 170개 -> 순환마디가 6*170까지 된다고 가정.
int mime[170]={0};
int j;
while(1)
{
cyc++;
for(j=0; ; j++) // 9 하나씩 덧붙이기
{
if(nine[j]==999999) continue;
nine[j]=10*nine[j]+9;
break;
}
for(j=0; j<170; j++)
{
mime[j]=nine[j]; // 각 자리수 복사
}
for(j=169; j>0; j--)
{
mime[j-1]+=(mime[j]%n)*Big; // 나눗셈
}
if(mime[0]%n==0) return cyc; // 배수 판정
else
{
for(j=0; j<170; j++) mime[j]=0;
}
}
}
int main()
{
int max=0, d=0;
int i;
for(i=1; i<1000; i++)
{
if(cycle(i)>max)
{
max=cycle(i);
d=i;
}
}
cout<<d<<endl;
}
2012.12.3
int primedet(int m)
{
if(m<=1) return 0; //1 이하의 수를 걸러낸다. m<1로 해도 답은 나오지만 정확한 코딩이 아님.
int i;
for(i=2; i*i<=m; i++)
{
if(m%i==0) return 0;
}
return 1;
}
int main()
{
int a,b,n;
int MAX=0, pnum=0, A, B;
for(a=-999; a<1000; a++)
{
for(b=-999; b<1000; b++)
{
for(n=0; ;n++)
{
if(primedet(n*n+a*n+b)==1)
{
pnum++;
continue;
}
else break;
}
if(pnum>MAX)
{
MAX=pnum;
A=a;
B=b;
}
pnum=0;
}
}
cout<<A*B<<endl;
return 0;
}
2012.12.9
void main()
{
int i=1, n=1, sum=1; //1은 미리 더하고
const int pow=1001*1001;
while(n<pow)
{
for(int j=0; j<4; j++)
{
n+=2*i;
sum+=n;
}
i++;
}
cout<<sum<<endl;
}
2012.12.12
이 문제를 풀기 전에 분석을 하자.
Observation. n자리(n≥7) 수 a에 대해, a의 자릿수의 다섯 제곱의 합은 항상 a보다 작다.
Proof. a의 각 자릿수의 다섯자리 제곱의 합은 최대 n×95이다. 이 값은 6 이상에서는 항상 10n-1보다 작은데, 둘의 차를 미분하면 10n-1ln(10)-95>0인 범위를 찾으면 된다는 걸 알 수 있다. 등호가 성립하는 n은 약 5.4로, 6보다 작다.
그러면 여섯자리 수까지만 조사해보면 됨을 알 수 있고, 따라서 다음과 같은 병맛 코드(...)로도 이 문제를 풀 수 있다.
#define fifth(X) ((X)*(X)*(X)*(X)*(X))
void main()
{
int dig_sum=0, tmp=0;
int sum=0;
for(int i=10; i<1000000; i++) //문제에서 한자리수는 제외한다 했음.
{
dig_sum=0;
tmp=i;
dig_sum+=fifth(tmp/100000);
tmp%=100000;
dig_sum+=fifth(tmp/10000);
tmp%=10000;
dig_sum+=fifth(tmp/1000);
tmp%=1000;
dig_sum+=fifth(tmp/100);
tmp%=100;
dig_sum+=fifth(tmp/10);
tmp%=10;
dig_sum+=fifth(tmp);
if(dig_sum==i) sum+=i;
}
cout<<sum<<endl;
}
재수가 좋아 250㎲쯤 걸렸다.
그런데 이대로만 하기엔 좀 찜찜하다 (...)
위 관찰을 증명하는 다른 방법으로는, n=5인 경우에 대해서 보이고 귀납법으로 보이는 것인데, 이것을 이용해서 다음과 같은 코딩을 할 수 있다.
#define fifth(X) ((X)*(X)*(X)*(X)*(X))
int power(int base, int exp)
{
int i, val=1;
for(i=0; i<exp; i++)
{
val*=base;
}
return val;
}
void main()
{
int count_num, exp_lim, dig_sum, tmp, i;
int ans_sum=0;
for(i=1; i*fifth(9)>=power(10,i-1); i++) //중괄호 없이 for 하나만 있음.
exp_lim=i;
count_num=power(10, exp_lim);
for(i=10; i<count_num; i++)
{
dig_sum=0;
tmp=i;
for(int j=exp_lim; j>-1; j--)
{
dig_sum+=fifth(tmp/power(10,j));
tmp%=power(10,j);
}
if(dig_sum==i) ans_sum+=i;
}
cout<<ans_sum<<endl;
}
이 코딩은 위 관측의 증명을 컴퓨터에게 맡겨놓는 코딩인데, 해보고 나니 괜히 문제를 복잡하게 푼 것 같다. 당연히 더 느려짐... 2초;
2012.12.9
#define BIG 1 00000 00000 //어라 이렇게해도 잘 되네
void main()
{
int i;
unsigned __int64 pow;
unsigned __int64 sum=0;
for(i=1; i<1001; i++)
{
pow=1;
for(int j=0; j<i; j++)
{
pow*=i;
while(pow>BIG)
{
pow-=BIG;
}
}
sum+=pow; //물론 sum에서 10자리 이상으로는 다 부정확한 값임.
}
printf("%I64d \n", sum); //일부러 printf를 써봤습니다.
}
2012.12.9
#define MIL 1000000
bool primedet(int n)
{
if(n<2) return false;
int i;
for(i=2; i*i<=n; i++)
{
if(n%i==0) return false;
}
return true;
}
void main()
{
int max=0, max_num=0;
int pr[80000]={2, }, pr_size=0;
int sum;
int i, j=0;
for(i=3; i<MIL; i+=2)
{
if(primedet(i)==false) continue;
else
{
pr[j++]=i;
pr_size++;
}
}
for(i=0; i<pr_size; i++)
{
sum=0;
for(j=i; j<pr_size; j++)
{
sum+=pr[j];
if(j-i+1<=max_num) // int primedet(int n)의 사용을 줄여 속도를 빠르게 해보려는 발악
continue;
else if(sum>MIL)
break;
else if(primedet(sum)==true) //else를 붙이면 조금 빨라지더군요.
{
max=sum;
max_num=j-i+1;
}
}
}
cout<<max<<endl;
}
- 그런데 남들의 풀이를 보니 회문수의 십진 전개를 쓸 생각을 못했다... -_-;; [본문으로]
- itoa( , , ); strcpy( , ); strrev( ); 이런걸 쓴 풀이도 봤습니다. [본문으로]
- 어느 인도 사람이 냈던 더 간결한 코드. main() { register int i,j,k,l; for(i = 5;k < 10001 /*k<(which prime number?)*/ ;i = i+2) { l = 0; for(j = 3;j < i/2;j = j+2) { if(!(i%j)){l = 1;break;} } if(!l)k++; } printf("%d\n",i-2); } 좋은 걸 두개나 배웠다. [본문으로]
- 비트셋이라는 걸 새로 알았는데, #include
해서 불러오는 모양이다. 정확히 뭔 지는 모르겠다. 찾아봐야지. [본문으로] - 이 문제는 드디어 pdf가 있는데 그 내용대로 만들어본 main함수 int a,b=0; for(a=2; a<10000; a++) { b=sigma(a); if(b>a && sigma(b)==a) {sum+=a+b;} } // 이게 내것보다 600㎲더 빠르다...orz [본문으로]