「AOJ581~590」の編集履歴(バックアップ)一覧に戻る
AOJ581~590」を以下のとおり復元します。
*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);
 }

復元してよろしいですか?