AOJ - Problem 0000 : QQ
九九を1*1=1から9*9=81まで出力する問題です。 forで回すだけ、最初なので簡単ですね。
#include <iostream> using namespace std; int main(){ for(int i=1 ; i<=9 ; i++){ for(int j=1 ; j<=9 ; j++){ cout << i << "x" << j << "=" << (i*j) << endl; } } }
AOJ - Problem 0001 : List of Top 3 Hills
10個の整数値のうち高い順に3つ出力する問題です。 STLを使うとソートを実装する必要がないのでとても楽です。
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main(){ int n; vector<int> high; for(int i=0 ; i<10 ; i++){ cin >> n; high.push_back( n ); } sort( high.begin() , high.end() ); for(int i=9 ; i>=7 ; i--){ cout << high.at( i ) << endl; } }
AOJ - Problem 0002 : Digit Number
2つの整数値の和の桁数を出力する問題です。 whileループで0になるまで10で割って代入します。 ループした回数が桁数になります。
#include <iostream> using namespace std; int main(){ int a, b, ans; while ( cin >> a >> b ) { a += b; ans = 0; while( a > 0 , ans++ , a /= 10 ); cout << ans << endl; } }
AOJ - Problem 0003 : Is it a Right Triangle?
3つの辺の長さを持つ三角形が直角三角形かどうか判定して出力する問題です。
多分中学校で習ったピタゴラスの定理を使います。
2つの辺の長さの2乗の和がもう一つの辺の長さの2乗と等しいか調べましょう。
辺が3つなので調べる組み合わせの3通りです。
#include <iostream> using namespace std; bool check(int a, int b , int c){ return ( a*a == ( b*b + c*c ) )? true : false ; } int main(){ int n, a, b, c; cin >> n; for(int i=0 ; i<n ; i++){ cin >> a >> b >> c; if( check(a,b,c) || check(b,c,a) || check(c,a,b) ){ cout << "YES" << endl; }else{ cout << "NO" << endl; } } }
AOJ - Problem 0004 : Simultaneous Equation
連立方程式を解く問題です。
yについて変形し代入し、xを求めます。
とても無駄が多く参考にならないコードです(汗)
一応Acceptしていますが…
問題文の下の方のHintにも書いていますが、xが-0になることがありますが、-0.000と出力するとWAになるので気をつけましょう。
頭のいい人なら変数の数が2つでなくnの場合でも解けるコードを書くのだろう…。
#include <cstdio> #define X 0 #define Y 1 #define C 2 #define SIKI1 0 #define SIKI2 1 #define LEFT 0 #define RIGHT 1 int main(){ double A[3][3][3]; double n[6]; while ( scanf("%lf %lf %lf %lf %lf %lf",&n[0],&n[1],&n[2],&n[3],&n[4],&n[5]) != EOF ){ //変数の初期化 for (int i=0 ; i<=RIGHT ; i++){ for (int j=0 ; j<=SIKI2 ; j++){ for (int k=0 ; k<=C ; k++){ A[i][j][k] = 0; } } } //値の代入 A[LEFT][SIKI1][X] = n[0]; A[LEFT][SIKI1][Y] = n[1]; A[RIGHT][SIKI1][C] = n[2]; A[LEFT][SIKI2][X] = n[3]; A[LEFT][SIKI2][Y] = n[4]; A[RIGHT][SIKI2][C] = n[5]; //式1のXを左辺から右辺へ移項する A[ RIGHT ][ SIKI1 ][ X ] += (-1.0)*(A[ LEFT ][ SIKI1 ][ X ]); A[ LEFT ][ SIKI1 ][ X ] = 0; //式1の両辺をYの係数で割る A[ RIGHT ][ SIKI1 ][ X ] /= A[ LEFT ][ SIKI1 ][ Y ]; A[ RIGHT ][ SIKI1 ][ C ] /= A[ LEFT ][ SIKI1 ][ Y ]; A[ LEFT ][ SIKI1 ][ Y ] = 1; //式2のYに代入して式2を(ax = b)の形にする int a = A[ LEFT ][ SIKI2 ][ Y ]; A[ LEFT ][ SIKI2 ][ X ] += a * A[ RIGHT ][ SIKI1 ][ X ]; A[ LEFT ][ SIKI2 ][ Y ] = 0; A[ RIGHT ][ SIKI2 ][ C ] += a * A[ RIGHT ][ SIKI1 ][ C ] * (-1.0); //XYの解が求まる double answerX = A[ RIGHT ][ SIKI2 ][ C ] / A[ LEFT ][ SIKI2 ][ X ]; double answerY = (n[2] + n[0]*answerX*(-1.0))/n[1]; //小数第4位を四捨五入する if ( (((int)(answerX*10000))%10) >= 5){ answerX += 0.001; } if ( (((int)(answerY*10000))%10) >= 5){ answerY += 0.001; } if (answerX==-0.0){ answerX = 0; } //解の出力 printf("%.3f %.3f\n", answerX , answerY); } return 0; }