*0582 Triangle Types http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0582 三角形のデータが与えられるのでそれが三角形をなすなら、鈍角三角形か直角か鋭角か判断してカウントし最後にその数を出力せよ。 解法 中学校で習った三角形の公式通りに判定するだけです。 #include<stdio.h> #include<algorithm> int main(){ int as[3],ans[3]={0}; while(1){ scanf("%d %d %d",&as[0],&as[1],&as[2]); std::sort(as,as+3); if(as[0]+as[1]<=as[2])break; int len =as[0]*as[0]+as[1]*as[1]; int len2=as[2]*as[2]; if(len==len2){ ans[0]++; }else if(len>len2){ ans[1]++; }else{ ans[2]++; } } printf("%d %d %d %d\n",ans[0]+ans[1]+ans[2],ans[0],ans[1],ans[2]); } *0583 Common Divisors http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0583 2つか3つの数が与えられるのでその数の公約数を小さい順に表示する問題。 解法 最初素因数分解してとめんどくさい方法を考えましたが、値の範囲が10^8と小さいことをりようして手抜きで解きました。 一番小さい数limitを選び√limitまでの数で試し割します。 as[j]/iが割り切れるならas[j]/iとiを割る候補として保管。 最後に小さい方から試し割していけばいいだけです。 #include<stdio.h> #include<set> #include<map> #include<algorithm> int main(){ int n,as[3]; scanf("%d",&n); std::set<int> ans; int limit; if(n==2){ scanf("%d %d",&as[0],&as[1]); limit=std::min(as[0],as[1]); }else{ scanf("%d %d %d",&as[0],&as[1],&as[2]); limit=std::min(std::min(as[0],as[1]),as[2]); } for(int i=1;i*i<=limit;i++){ for(int j=0;j<n;j++){ if(as[j]%i==0){ ans.insert(as[j]/i); ans.insert(i); } } } for(std::set<int>::iterator it=ans.begin();it!=ans.end();it++){ int num=(*it); bool ok=true; for(int i=0;i<n;i++)if(as[i]%num!=0)ok=false; if(ok==true)printf("%d\n",num); } } *aoj0588 Simple Calculator http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0588 優先順位のない式で四則演算を行う問題。 解法 手前から順番に読み込んで処理するだけです。 #include<stdio.h> int main(){ int ans,a; char t[3]=" "; scanf("%d",&ans); while(1){ scanf("%s",t); if(t[0]=='=')break; scanf("%d",&a); if(t[0]=='+')ans+=a; if(t[0]=='-')ans-=a; if(t[0]=='*')ans*=a; if(t[0]=='/')ans/=a; } printf("%d\n",ans); } *aoj0590 Available Areas http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0590 与えられた自然数が、2xy+x+y x>0,y>0 x、yは自然数として表現できるか判別する問題。 解法 yを決定すると面積をsとして a=(s-y)/(2y+1)が自然数になれば答えが存在します。 式の対称性から考えてa=<yの間だけ計算すれば十分なようです。 #include<stdio.h> #include<iostream> int main(){ int n,ans=0; scanf("%d",&n); int y,s; for(int i=0;i<n;i++){ scanf("%d",&s); bool ok=false; for(y=1;(2*y+1)<=s-y;y++){ if((s-y)%(2*y+1)==0){ ok=true; break; } int t=(s-y)/(2*y+1); if(t<y)break; } ans+=(ok==false); } printf("%d\n",ans); }