「オイラープロジェクト91~100」の編集履歴(バックアップ)一覧に戻る
#include<stdio.h> #include<algorithm> int main(){ int a[3]; int size=50,ans=0; for(int x1=0;x1<=size;x1++){ for(int y1=0;y1<=size;y1++){ if(x1==0&&y1==0)continue; for(int x2=0;x2<=size;x2++){ for(int y2=0;y2<=size;y2++){ if((x2==0&&y2==0)||(x2==x1&&y2==y1))continue; a[0]=(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1); a[1]=x1*x1+y1*y1; a[2]=x2*x2+y2*y2; std::sort(a,a+3); if(a[0]+a[1]==a[2]){ ans++; } } } } } printf("%d",ans/2); }
#include<stdio.h> int memo[1000]={0}; int saiki(int n){ if(n==1||n==89){ return n; } if(n<1000&&memo[n]!=0)return memo[n]; int next=0,m=n; while(m!=0){ next+=(m%10)*(m%10); m/=10; } m=saiki(next); if(n<1000)memo[n]=m; return m; } int main(){ int ans=0; for(int i=1;i<10000000;i++){ ans+=(saiki(i)==89); } printf("%d",ans); }
#include<stdio.h> #include<vector> #include<iostream> #include<set> #include<time.h> const int up=34000; std::vector<int> sosuu2; std::set<int> memo; bool so[up+1]; int gcd ( int a, int b ){ int c; while ( a != 0 ) { c = a; a = b%a; b = c; } return b; } void setSo(){ int i2; memset(so,true,sizeof(so)); so[0]=so[1]=false; for(int i=4;i<=up;i+=2)so[i]=false; memo.insert(1); sosuu2.push_back(4); memo.insert(4); for(int i=3;i<=up;i+=2){ if(so[i]==false)continue; sosuu2.push_back(i*i); memo.insert(i*i); i2=i*2; for(int j=i*3;j<=up;j+=i2){ so[j]=false; } } } bool check(int a,int& count2){ while(a>0&&a%2==0){ a/=2; count2++; } for(int i=0;sosuu2[i]*sosuu2[i]<=a;i++){ int p=sosuu2[i]; while(a%p==0){ a/=p; } } return memo.find(a)!=memo.end(); } bool calc(const int n,const int add){ int a=n+add; int count2=-4; while(a>0&&a%2==0){ a/=2; count2+=2; } int g=gcd(3*n+add,n-add); a=g; while(a>0&&a%2==0){ a/=2; count2+=2; } a=(3*n+add)/g; if(check(a,count2)==false)return false; a=(n-add)/g; if(check(a,count2)==false)return false; if(count2<0||count2%2==1)return false; return true; } int main(){ double start=clock(); setSo(); int limit=10000*10000*10; __int64 ans=0; for(int n=3;3*n+1<=limit;n+=2){ ans+=calc(n,1)*(3*n+1); } for(int n=3;3*n-1<=limit;n+=2){ ans+=calc(n,-1)*(3*n-1); } std::cout<<"\nans="<<ans<<" time="<<clock()-start; }
#include<stdio.h> #include<math.h> #include<iostream> const int up=1000000; int memo[up+2]={0}; __int64 wa(int n){ __int64 up=sqrt(n),c1,t,re=1,s=n; for(int i=2;i<=up;i++){ c1=1; t=1; while(n%i==0){ n/=i; t*=i; c1+=t; } re*=c1; } if(n!=1){ re*=(n+1); } return re-s; } int saiki(__int64 n,int s,int deep){ if(n>=up)return 0;//100万を超えてしまった if(s==n&&deep>0)return deep;//輪になった if(memo[(int)n]!=0)return 0;//他の輪に外から入ってしまった memo[(int)n]=1;//とりあえず使用済みにしておく int re=saiki(wa(n),s,deep+1); memo[(int)n]=re;//正式にループの長さが決まった return re; } int main(){ for(int i=2;i<up;i++){ if(memo[i]==0){ saiki(i,i,0); } } int ans,loopSize=0; for(int i=0;i<up;i++){ if(memo[i]>loopSize){ ans=i; loopSize=memo[i]; } } printf("%d %d\n",ans,loopSize); }
(defvar mask 10000000000) mask (setq mask 10000000000) 10000000000 (defun saiki (n m all) (if (< 0 m) (if (= (mod m 2) 1) (saiki (mod (* n n) mask) (floor (/ m 2)) (mod (* all n) mask)) (saiki (mod (* n n) mask) (floor (/ m 2)) all)) all)) saiki (mod (+ (* (saiki 2 7830457 1) 28433) 1) mask)
#include<stdio.h> #include <stdlib.h> #include<string.h> #include<map> #include<string> #include<vector> #include<iostream> //何だかめんどくさい問題なので邪道な手口を使ってコードを短縮する //実務では100%禁じ手だろうな struct S{ int cs[27]; bool operator<(const S& s)const{ for(int i=0;i<27;i++){ if(cs[i]!=s.cs[i])return cs[i]<s.cs[i]; } return false; } }; __int64 ans=0; int spents[11]={0}; __int64 stringToNum(std::string str){ if(str[0]==1)return -1;//小さい数字なら何でもいい __int64 re=0; for(int i=0;str[i]!='\0';i++){ re=re*10+(str[i]-1); } return re; } void saiki(int deep,std::string w1,std::string w2){ if(deep==w1.size()){ __int64 k1,k2,n1=stringToNum(w1),n2=stringToNum(w2); if(n1==1||n2==1)return; k1=sqrt(n1); k2=sqrt(n2); if(k1*k1==n1&&k2*k2==n2){ if(ans<n1)ans=n1; if(ans<n2)ans=n2; //std::cout<<"("<<n1<<" "<<n2<<")"; } }else{ //この文字は数字に変換済み if(w1[deep]<11){ saiki(deep+1,w1,w2); return ; } __int64 next1,next2; std::string nextW1,nextW2; char c; for(int i=1;i<11;i++){ //\0の取り扱いがめんどくさいので数字を1大きくして文字列を数字に変換する //実務でないからこそだな if(i==1&&deep==0)continue; if(spents[i]==0){ spents[i]=1; nextW1=w1; nextW2=w2; c=w1[deep]; for(int j=0;j<w1[j]!='\0';j++){ if(w1[j]==c){ nextW1[j]=i; } if(w2[j]==c){ nextW2[j]=i; } } saiki(deep+1,nextW1,nextW2); spents[i]=0; } } } } int main(){ char front[10],text[20],c; FILE *fp; if ((fp = fopen("euler98Data.txt", "r")) == NULL) { printf("file open error!!\n"); exit(EXIT_FAILURE); /* (3)エラーの場合は通常、異常終了する */ } S s; std::vector<std::string> vec; std::map<S,std::vector<std::string> > memo; std::map<S,std::vector<std::string> >::iterator it; std::string str1,str2; while(fscanf(fp,"%[^\"]\"%[^\"]\"",front,text)!=EOF){ memset(s.cs,0,sizeof(s.cs)); for(int i=0;text[i]!='\0';i++){ s.cs[text[i]-'A']++; } if(memo.find(s)==memo.end()){ vec.push_back(text); memo[s]=vec; vec.pop_back(); }else{ memo[s].push_back(text); } if(fscanf(fp,"%c",&c)==EOF)break; } fclose(fp); printf("\nallRead\n"); for(it=memo.begin();it!=memo.end();it++){ //テキストを解析した結果対になるアナグラムが3つ以上はないことが判明 if((*it).second.size()>1){ str1=(*it).second[0]; str2=(*it).second[1]; std::cout<<"<"<<str1<<" "<<str2<<">\n"; saiki(0,str1,str2); } } std::cout<<ans<<"\n"; }
#include<stdio.h> #include<math.h> int main(){ double a,b,c,myMax=0; int ansNo; for(int i=0;i<1000;i++){ scanf("%lf,%lf",&a,&b); c=log(a)*b; printf("( %lf %lf)\n",log(a),b); if(c>myMax){ myMax=c; ansNo=i+1; } } printf("%d\n",ansNo); }
#include<stdio.h> #include<math.h> #include<iostream> #include <iomanip> int main(){ double a=15,n=21,n2,a2,c; std::cout.precision(4); std::cout.setf(std::ios::fixed); while(n<1000000000000.0){ c=a+n-1; n2=(1+4*c+sqrt(8*c*c+1))/2.0; a=n2-c; n=n2; std::cout<<a<<"/"<<n<<"\n"; } }