kazm_m の部屋
ProjectEuler 1~
最終更新:
kazm_m
-
view
基本的にC言語で記述
問題1
#include<stdio.h> int main(){ int sum=0; int i; for(i=1;i<1000;i++){ if(i%3 == 0 || i%5==0)sum+=i; } printf("Ans=%d\n",sum); }
問題2
#include<stdio.h> int main(){ int prev=1,now=2,next=3; int sum=2,i; for(i=3;next<4000000;i++){ if(next%2==0)sum+=next; prev=now; now=next; next+=prev; } printf("Ans=%d\n",sum); return 0; }
問題3
VisualStudioでビルド cygwinでは通らなかった(longlong 64bitが原因?) #include<stdio.h> int main(){ long long a; a=600851475143; int ma=0,i; for(i=2;i*i<=a;i++){ if(a%i==0){ a/=i; if(ma<i)ma=i; i=1; } } if(ma<a){ma=a;} printf("Ans=%d\n",ma); return 0; }
問題4
#include<stdio.h> int check(int a){ int keta=0,i; int b[8]={0,0,0,0,0,0,0,0}; while(a>=1){ b[keta++]=a%10; a/=10; } for(i=0;i<keta;i++){ if(b[i]!=b[keta-1-i])return -1; } return 1; } int main(){ int i,j,ma=0; for(i=999;i>99;i--){ for(j=i;j>99;j--){ if(check(i*j)==1 && ma<i*j ){ ma=i*j; printf("%d×%d=%d\n",i,j,i*j); } } } printf("Ans=%d\n",ma); return 0; }
問題5
#include<stdio.h> int a[21]; int check(int b){ int tmp[21]; int i,j; for(i=0;i<21;i++)tmp[i]=0; for(i=2;i*i<=b;i++){ if(b%i==0){ b/=i; tmp[i]++; i=1; } } tmp[b]++; for(i=2;i<21;i++){ if(tmp[i]>a[i])a[i]=tmp[i]; } return; } int main(){ int i,j,tmp,sum=1; for(i=0;i<21;i++)a[i]=0; for(i=2;i<21;i++){ check(i); } for(i=2;i<21;i++){ for(j=0,tmp=1;j<a[i];j++){ tmp*=i; } sum*=(tmp); } printf("Ans=%d\n",sum); return 0; }
問題6
#include<stdio.h> int main(){ int i; double re1=0,re2=0; for(i=1;i<=100;i++){ re1+=i; re2+=i*i; } printf("%10.0f\n",re1*re1-re2); return 0; }
問題7
/*まったく意味のない関数化w*/ #include<stdio.h> #define SEARCH 10001 int sosu(int a){ int i; for(i=2;i*i<=a;i++){ if(a%i==0)return 0; } return 1; } int search_sosu(int a){ int i,count=1; if(a==1)return 2; for(i=3;!(count==a);i+=2){ if(sosu(i)==1)count++; } return i-2; } int main(){ printf("Ans=%d\n",search_sosu(SEARCH)); return 0; }
問題8
#include<stdio.h> int suti(char ch){ int i; char a[10]={'0','1','2','3','4','5','6','7','8','9'}; for(i=0;i<10;i++){ if(a[i]==ch)return i; } return -1; } int main(){ char c; int i,ma=1,now=1,a[6]={1,1,1,1,1,1},tmp; while(EOF!=scanf("%c ",&c)){ a[5]=suti(c); for(i=1,now=1;i<6;i++){ now*=a[i]; } if(ma<now)ma=now; for(i=0;i<5;i++){ tmp=a[i]; a[i]=a[i+1]; a[i+1]=tmp; } } printf("Ans=%d\n",ma); return 0; }
問題9
#include<stdio.h> int main(){ int i,j,tmp; for(i=1;i<333;i++){ for(j=i+1;j<500;j++){ tmp=1000-i-j; if(tmp<=j)break; if(i*i+j*j==tmp*tmp)printf("%d",i*j*tmp); } } return 0; }
問題10
#include<stdio.h> int sosu(int a){ int i; for(i=2;i*i<=a;i++){ if(a%i==0)return -1; } return 0; } int main(){ int i,j; long long sum=2; for(i=3;i<=2000000;i++){ if(sosu(i)==0)sum+=i; } printf("SUM=%lld\n",sum); return 0; }
問題11
#include<stdio.h> int main(){ int i,j,ma=1,now,a[20][20]; for(i=0;i<20;i++){ for(j=0;j<20;j++){ scanf("%d ",&a[i][j]); } } for(i=0;i<20;i++){ for(j=0;j<20;j++){ if(j<=16){ now=a[i][j]*a[i][j+1]*a[i][j+2]*a[i][j+3]; if(ma<now)ma=now; } if(i<=16){ now=a[i][j]*a[i+1][j]*a[i+2][j]*a[i+3][j]; if(ma<now)ma=now; } if(i<=16 && j<=16){ now=a[i][j]*a[i+1][j+1]*a[i+2][j+2]*a[i+3][j+3]; if(ma<now)ma=now; } if(i<=16 && j>=3){ now=a[i][j]*a[i+1][j-1]*a[i+2][j-2]*a[i+3][j-3]; if(ma<now)ma=now; } if(i>=3 && j<=16){ now=a[i][j]*a[i-1][j+1]*a[i-2][j+2]*a[i-3][j+3]; if(ma<now)ma=now; } } } printf("Ans=%d\n",ma); return 0; }
問題12
#include<stdio.h> int check(int a){ int re=2,i; for(i=2;i*i<=a;i++){ if(a%i==0)re+=2; if(i*i==a)re-=1; } return re; } int main(){ int i,now=0; for(i=1;;i++){ now+=i; if(check(now)>=501){ printf("Ans=%d\n",now); break; } } return 0; }
問題13
#include<stdio.h> int suti(char ch){ char tmp[10]={'0','1','2','3','4','5','6','7','8','9'}; int k; for(k=0;k<10;k++){ if(tmp[k]==ch)return k; } return 0; } int main(){ int a[60],i,j; char ch; for(i=0;i<60;i++)a[i]=0; for(i=0;i<100;i++){ for(j=0;j<50;j++){ scanf("%c ",&ch); //printf("%d",suti(ch)); a[49-j]+=suti(ch); } //printf("\n"); } for(i=0;i<59;i++){ a[i+1]+=a[i]/10; a[i]%=10; } for(i=59;;i--){ if(a[i]!=0){ for(j=0;j<10;j++)printf("%d",a[i-j]); break; } } return 0; }
問題14
#include<stdio.h> int a[1000001]; int check(int t){ long long tmp=t; //printf("%lld\n",tmp); int count=0; if(a[t]!=0)return a[t]; do{ if(tmp%2==0){ tmp/=2; }else{ tmp=tmp*3+1; } count++; }while(tmp>1000000); a[t]=check(tmp)+count; return a[t]; } int main(){ int i,ma=-1; int result=-1; for(i=1000000;i>1;i--){ a[i]=0; } a[1]=1; for(i=1000000;i>1;i--){ a[i]=check(i); } for(i=1000000;i>1;i--){ if(ma<a[i]){ ma=a[i]; printf("%d %d\n",ma,i); } } return 0; }
問題15
#include<stdio.h> #define X 20 #define Y 20 int main(){ int i,j; long long a[100][100]; for(i=0;i<100;i++){ for(j=0;j<100;j++)a[i][j]=0; } a[0][0]=1; for(i=0;i<=Y;i++){ for(j=0;j<=X;j++){ if(j>0)a[i][j]+=a[i][j-1]; if(i>0)a[i][j]+=a[i-1][j]; } } printf("Ans=%lld\n",a[Y][X]); return 0; }
問題16
#include<stdio.h> #define KETA 500 int a[KETA]; void cal(int aa,int bb){ int i,j,count=0,flag=0; int tmp=aa; for(i=0;i<KETA;i++)a[i]=0; while(tmp>=1){ a[count++]=tmp%10; tmp/=10; } for(i=0;i<bb-1;i++){ for(j=0;j<KETA;j++)a[j]*=aa; for(j=0;j<KETA-1;j++){ a[j+1]+=a[j]/10; a[j]%=10; } } // for(i=KETA-1;i>=0;i--){ // if(a[i]!=0)flag=1; // if(flag==1)printf("%d",a[i]); // } } int main(){ int i,sum=0; cal(2,1000); for(i=0;i<KETA;i++)sum+=a[i]; printf("Ans=%d\n",sum); return 0; }
問題17
#include<stdio.h> int moji_num(int in){ int re=0; int a[20]={0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,8,8}; int b[10]={0,0,6,6,5,5,5,7,6,6}; if(in%100 < 20)re+=a[in%100]; else re+=a[in%10]; re+=b[(in/10)%10]; if(in>=100){ re+=a[in/100]; re+=7; if(in%100 != 0)re+=3; } if(in==1000)re++; return re; } int main(){ int i,sum=0; for(i=1;i<=1000;i++){ printf("%d =%d文字\n",i,moji_num(i)); sum+=moji_num(i); } printf("%d\n",sum); return 0; }
問題18
#include<stdio.h> int main(){ int a[2][200]; int lim=1,ma=0,tmp; int i,j; for(i=0;i<2;i++){ for(j=0;j<200;j++){ a[i][j]=0; } } i=0; j=0; while(EOF !=scanf("%d",&tmp)){ a[1][i++]=tmp; if(i<lim)continue; for(i=0;i<200;i++){ if(i==0 || a[0][i-1]<a[0][i]){ a[1][i]+=a[0][i]; }else{ a[1][i]+=a[0][i-1]; } } for(i=0;i<200;i++){ a[0][i]=a[1][i]; } lim++; i=0; } for(i=0;i<200;i++){ if(a[0][i]==0)break; if(ma<a[0][i]) ma=a[0][i]; } printf("%d\n",ma); return 0; }
問題19
#include<stdio.h> int uruu(int year){ if(year%4!=0 || (year%100==0 && year%400!=0))return 0; return 1; } int main(){ int cl[12]={31,31,28,31,30,31,30,31,31,30,31,30};//12月・1月・…・11月 int now=1,sum=0; int i,j; for(i=1900;i<2001;i++){ for(j=1;j<=12;j++){ if(i!=1900 && now%7==0)sum++; now+=cl[j%12]; if(j==2)now+=uruu(i); } } printf("%d\n",sum); return 0; }
問題20
#include<stdio.h> int a[2][500]; void cal(int b){ int i,j=0,k; for(i=0;i<500;i++)a[1][i]=0; while(b>=1){ for(i=0;i<500;i++)a[1][i+j] += (a[0][i]*(b%10)); b/=10; j++; } for(i=0;i<499;i++){ a[1][i+1]+=(a[1][i]/10); a[1][i] %= 10; } for(j=0;j<500;j++)a[0][j]=a[1][j]; } int main(){ int i,j,k,sum=0; for(i=0;i<2;i++){ for(j=0;j<500;j++)a[i][j]=0; } a[0][0]=1; for(i=1;i<=100;i++){ cal(i); printf("*%d=",i); for(k=499;a[0][k]==0;k--){}; for(j=k;j>=0;j--)printf("%d",a[0][j]); printf("\n"); } for(j=499;j>0;j--)sum+=a[0][j]; printf("\n%d\n",sum); return 0; }
問題21
#include<stdio.h> int cal(int n){ int i; int sum=1; for(i=2;i*i<=n;i++){ if(n%i==0){ sum+=i; if(i!=n/i)sum+=n/i; } } return sum; } int main(){ int i,j; int sum=0; int a[10000]; for(i=0;i<10000;i++)a[i]=0; for(i=1;i<10000;i++){ if(i==cal(cal(i)) && i!=cal(i) ){ a[i]=1; sum+=i; printf("%d %d %d\n",i,cal(i),cal(cal(i))); } } printf("%d\n",sum); return 0; }
問題22
#include<stdio.h> #include<string.h> char ch[6000][20]; int main(){ int i=0,j=0,k,sum=0,now; char tmp[20]; char tmp2; while(EOF!=scanf("%c",&tmp2)){ if(tmp2==','|| tmp2=='"'){ if(j!=0){ j=0; strcpy(&ch[i++][0],tmp); } continue; } tmp[j++]=tmp2; tmp[j]='\0'; } for(j=i-1;j>0;j--){ for(k=0;k<j;k++){ if(strcmp(&ch[k][0],&ch[k+1][0])>0){ strcpy(tmp,&ch[k][0]); strcpy(&ch[k][0],&ch[k+1][0]); strcpy(&ch[k+1][0],tmp); } } } for(j=0;j<i;j++){ now=0; for(k=0;ch[j][k]!='\0';k++) now+=ch[j][k]-64; sum+=(j+1)*now; printf("%d*%d=%d 合計%d %s\n",j+1,now,now*(j+1),sum,&ch[j][0]); } printf("%d\n",sum); return 0; }
問題23
#include<stdio.h> #define MAX_NUM 28124 int search(int n){ int sum=1,i; for(i=2;i*i<=n;i++){ if(n%i==0){ sum+=i; if(i*i!=n)sum+=n/i; } } return (n<sum); } int main(){ int a[2][MAX_NUM]; int i,j; int sum=0; for(i=1;i<MAX_NUM;i++){ a[1][i]=0; a[0][i]=search(i); } for(i=1;i<MAX_NUM;i++){ if(a[0][i]==0)continue; for(j=i;i+j<MAX_NUM;j++){ if(a[0][j]==0)continue; a[1][i+j]=1; } } for(i=0;i<MAX_NUM;i++){ if(a[1][i]==0){ sum+=i; printf("now=%d sum=%d\n",i,sum); } } printf("%d\n",sum); return 0; }
問題24
#include<stdio.h> int a[10]; int kaizyo(int n){ if(n<=1)return 1; return n*kaizyo(n-1); } void search(int n,int size){ if(size==0)return; int i,tmp=0; tmp= n / (kaizyo(size-1)); for(i=0;;i++){ if(a[i]==0)tmp--; if(tmp<0){ a[i]=1; printf("%d ",i); break; } } search(n%kaizyo(size-1),size-1); } int main(){ int i; for(i=0;i<10;i++)a[i]=0; scanf("%d",&i); search(i-1,10); return 0; }
問題25
#include<stdio.h> int main(){ int a[1000],b[1000]; int i,count=2,tmp; for(i=0;i<1000;i++){ a[i]=0; b[i]=0; } a[0]=1; b[0]=1; while(b[999]==0){ for(i=0;i<1000;i++){ a[i]+=b[i]; a[i+1]+=a[i]/10; a[i]%=10; tmp=a[i]; a[i]=b[i]; b[i]=tmp; } count++; } printf("%d\n",count); return 0; }
問題26
#include<stdio.h> int zyunkan(int n){ int i,j; int now=1; int a[1000]; for(j=0;j<1000;j++)a[j]=0; a[1]=1; for(i=2;;i++){ now*=10; now%=n; if(now==0)return 0; if(a[now]!=0)return i-a[now]; a[now]=i; } return -1; } int main(){ int i,ma=0; int a[1000]; for(i=2;i<1000;i++){ if (ma<zyunkan(i)){ ma=zyunkan(i); printf("d = %d のとき %d\n",i,ma); } } return 0; }
問題27
#include<stdio.h> int sosu(int n){ if(n<=1)return 0; int i; for(i=2;i*i<=n;i++){ if(n%i==0)return 0; } return 1; } int main(){ int i,length=0; int a,b; for(a=-999;a<1000;a++){ for(b=-999;b<1000;b++){ i=0; while(sosu(i*i+a*i+b)==1){ i++; } if(i>length){ length=i; printf("Ans=%d %d\n",a*b,i); } } } return 0; }
問題28
#include<stdio.h> int main(){ int i,sum=1; for(i=3;i<=1001;i+=2){ sum+=(4*i*i-6*i+6); } printf("Ans=%d\n",sum); return 0; }
問題29
/*無理やり解いた もうちょっとスマートなプログラムに書き直す予定*/ #include<stdio.h> int tmp[100]; void soinsu(int a){ int i; for(i=0;i<100;i++)tmp[i]=0; for(i=2;i*i<=a;i++){ if(a%i==0){ printf("%3d",i); tmp[i]++; a/=i; i=1; } } tmp[a]++; printf("%3d\n",a); } int main(){ int *a=calloc(10000*100,sizeof(int));//[10000][100]; int i,j,k,l,n=0,flag,sum=0; for(i=2;i<=100;i++){ soinsu(i); for(j=2;j<=100;j++){ k=0; for(k=0,flag=1;k<n;k++){ flag=0; for(l=0;l<100;l++){ if(a[k*100+l]!=tmp[l]*j)flag=1; } if(flag==0)break; } if(k==n){ for(k=0;k<100;k++)a[n*100+k]=tmp[k]*j; n++; printf("%d^{%d}\n",i,j); } } } printf("Ans=%d\n",n); return 0; }
問題30
#include<stdio.h> int main(){ int a[10]={0,1,32,243,1024,3125,7776,16807,32768,59049}; int i,j,k,sum=0; for(i=2;i<1000000;i++){ k=0; j=i; while(j>=1){ k+=a[j%10]; j/=10; } //printf("%d %d\n",k,i); if(k==i){ printf("%d\n",k); sum+=k; } } printf("Ans=%d\n",sum); return 0; }
問題31
#include<stdio.h> int coin[8]={1,2,5,10,20,50,100,200}; int search(int now,int n){ int re=0,i; if(now==200)return 1; if(now>200)return 0; for(i=n;i<8;i++){ re+=search(now+coin[i],i); } return re; } int main(){ printf("Ans=%d\n",search(0,0)); return 0; }
問題32
#include<stdio.h> int keta(int n){ int re=0; for(re=1;(n/=10)>=1;re++); return re; } int check(int l,int r){ int re=0,tmp,k; int a[10]; for(k=0;k<10;k++)a[k]=0; for(tmp=l*r,a[tmp%10]++;tmp>=1;re++,tmp/=10,a[tmp%10]++); for(tmp=l,a[tmp%10]++;tmp>=1;re++,tmp/=10,a[tmp%10]++); for(tmp=r,a[tmp%10]++;tmp>=1;re++,tmp/=10,a[tmp%10]++); for(k=1;k<10;k++)if(a[k]!=1) return 0; return 1; } int main(){ int i,j,k,l=0,Sum=0; int add[100]; for(i=0;i<100;i++)add[i]=0; for(i=1;i<100;i++){ for(j=i+1;keta(i)+keta(j)+keta(i*j)<=9;j++){ //printf("i=%d j=%d i*j=%d keta=%d\n",i,j,i*j,keta(i)+keta(j)+keta(i*j)); if(keta(i)+keta(j)+keta(i*j)==9 && check(i,j)){ for(k=0;k<l;k++) if(add[k]==i*j)break; if(k==l){ add[k]=i*j; printf("%d * %d = %d\n",i,j,i*j); Sum+=i*j; l++; } } } } printf("%d",Sum); return 0; }
問題33
#include<stdio.h> int main(){ int i,j,k; int si=1,sj=1; for(i=11;i<100;i++){ for(j=i-1;j>9;j--){ if((j/10)*i==(i%10)*j && i/10==j%10){ printf("%d/%d\n",j,i); si*=i%10; sj*=j/10; } } } for(i=sj;i>0 && (si%i || sj%i);i--); printf("Ans=%d\n",si/i); return 0; }
問題34
#include<stdio.h> int kaizyo(int n){ if(n<=1)return 1; return n*kaizyo(n-1); } int kaizyo2(int n){ int re=0; do{ re+=kaizyo(n%10); n/=10; }while(n); return re; } int main(){ int i,sum=0; for(i=10;;i++){ if(i==kaizyo2(i)){ sum+=i; printf("%d sum=%d\n",i,sum); } } return 0; }
問題35
#include<stdio.h> int keta(int n){ int re=1; while((n/=10)>=1)re++; return re; } int sosu(int n){ int i; for(i=2;i*i<=n;i++){ if(n%i==0)return 0; } return 1; } int reverse(int n){ int re=0; do{ re=re*10+n%10; }while((n/=10)>=1); return re; } int check(int n){ int i,re=0,tmp,tmp2,tmp3; tmp=n; for(i=0;i<keta(n);i++){ tmp3=keta(tmp); tmp2=tmp%10; tmp=reverse(tmp/10); tmp=reverse(tmp*10+tmp2); if(tmp3!=keta(tmp))return 0; if(sosu(tmp)==0)return 0; } return 1; } int main(){ int i,tmp,tmp2,tmp3,sum=1; for(i=3;i<=1000000;i+=2){ if(check(i)==1){ printf("%d\n",i); sum++; } } printf("Ans=%d\n",sum); return 0; }
問題36
#include<stdio.h> int reverse(int n){ int re=0; while(n>=1){ re=re*10+n%10; n/=10; } return re; } int check(int n){ int keta[32]; int i,j; for(i=0;n!=0;i++){ keta[i]=n%2; n/=2; } for(j=0;j<i;j++){ if(keta[j]!=keta[i-j-1])return 0; } return 1; } int main(){ int i,sum=0; for(i=1;i<1000000;i++){ if(i==reverse(i) && check(i)==1){ sum+=i; printf("%d sum=%d\n",i,sum); } } return 0; }
問題37
#include<stdio.h> int sosu(int n){ int i; if(n<=1)return 0; for(i=2;i*i<=n;i++){ if(n%i==0)return 0; } return 1; } int reverse(int n){ int re=0; while(n>=1){ re=re*10+n%10; n/=10; } return re; } int check(int n){ int tmp=n; while(tmp>=1){ if(sosu(tmp)==0)return 0; tmp/=10; } tmp=n; while(tmp>=1){ if(sosu(tmp)==0)return 0; tmp=reverse(reverse(tmp)/10); } return 1; } int main(){ int i,sum=0; for(i=11;;i+=2){ if(check(i)==1){ sum+=i; printf("%d sum=%d\n",i,sum); } } return 0; }
問題38
#include<stdio.h> int keta(int n){ int re=1; while((n/=10)>=1)re++; return re; } int check(int n,int j){ int tmp,k,a[10]; for(k=0;k<10;k++)a[k]=0; for(k=1;k<j;k++){ tmp=n*k; while(tmp){ a[tmp%10]++; tmp/=10; } } for(k=1;k<10;k++){ if(a[k]!=1)return 0; } return 1; } int main(){ int i,j,k,ke; for(i=1;;i++){ ke=0; for(j=1;ke<9;j++){ ke+=keta(i*j); } if(ke!=9)continue; if(check(i,j)==1){ for(k=1;k<j;k++){ printf("%d",i*k); } printf("\n"); } } return 0; }
問題39
#include<stdio.h> int main(){ int i,j,p,ma=0; int ans[1000]; for(i=0;i<1000;i++)ans[i]=0; for(p=999;p>2;p--){ for(i=1;i<=333;i++){ for(j=i;j<=p-i-j;j++){ if(i*i+j*j==(p-i-j)*(p-i-j)){ printf("%d %d %d\n",i,j,p-i-j); ans[p]++; } } } } for(i=1;i<1000;i++){ if(ans[i]>ma){ ma=ans[i]; printf("%d Ans=%d\n",ma,i); } } return 0; }
問題40
#include<stdio.h> int keta(int n){ int re=1; while((n/=10)>=1)re++; return re; } int reverse(int n){ int re=0; while(n>=1){ re=re*10+n%10; n/=10; } return re; } int main(){ int i,j=1,now,tmp,check=1,ke=0,Ans=1; for(i=1;;i++){ ke=keta(i); tmp=reverse(i); while(ke-->0){ now=tmp%10; tmp/=10; if(j==check){ check*=10; Ans*=now; printf("Ans=%d now=%d\n",Ans,now); if(check>1000000)return 0; } j++; } } return 0; }