Switching Railroad Cars(AOJ No.0013), Integral(AOJ No.0014), National Budget(AOJ No.0015)
Switching Railroad Cars(AOJ No.0013)
1,2,...,10の番号が振られた電車があり、0以上10以下の整数列が与えられる。
1以上10以下の数字は電車の
LIFOの構造への挿入を表し、
0は電車の取り出しを意味する。
取り出された順に電車の番号列を出力する
スタックに入れたり出したりするだけ
import java.util.*; public class aoj0013 { static final Scanner stdin = new Scanner(System.in); public static void main(String[] args) { Stack<Integer> st = new Stack<Integer>(); while(stdin.hasNext()){ int i = stdin.nextInt(); if( i == 0 ) System.out.println( st.pop() ); else st.push(i); } } }
Integral(AOJ No.0014)
で囲まれる部分の面積を数値積分で求める。
ただし、
としたとき、
面積を台形公式ではなく、長方形で
で求める。
dは600の約数で面積は整数で答える。
import java.util.*; public class aoj0014 { static final Scanner stdin = new Scanner(System.in); public static void main(String[] args) { while(stdin.hasNext()) System.out.println( solve(stdin.nextInt()) ); } static int solve(int d){ int ans = 0; for( int i=d; i<600; i+=d ) ans += d*i*i; return ans; } }
National Budget(AOJ No.0015)
0以上80桁以下の2数a,bが与えられてその和を返す。
ただし、和が80桁を超える場合は、overflowと出力する。
アルゴリズム
BigIntegerを使えば単に足すだけ。
それだと簡単すぎるので、各位ごとに足していく方法を試した。
まず、m = max(a.length, b.length)として、a,bがm桁になるまで'0'でパディングする。
各位ごとに和を計算する(桁上がりも忘れずに)。
コード
import java.util.*; import java.math.*; public class aoj0015 { static final Scanner stdin = new Scanner(System.in); static final Solver solver = Solver.BigInteger; public static void main(String[] args) { int n = stdin.nextInt(); while( n-- > 0 ) System.out.println( solver.solve(stdin.next(), stdin.next() ) ); } enum Solver { BigInteger { @Override String solve(String a, String b){ String ans = new BigInteger(a).add( new BigInteger(b) ).toString(); return ans.length() > 80 ? "overflow" : ans; }}, Naive { @Override String solve(String a, String b){ StringBuilder A = new StringBuilder(a); StringBuilder B = new StringBuilder(b); int m = Math.max(A.length(), B.length()); A.reverse(); B.reverse(); while( A.length() < m ) A.append('0'); while( B.length() < m ) B.append('0'); int carry = 0; StringBuilder ans = new StringBuilder(); for(int i=0; i<m; ++i){ int s = (A.charAt(i) - '0') + (B.charAt(i) - '0') + carry; //int s = Character.digit( A.charAt(i), 10 ) + Character.digit( B.charAt(i), 10 ) + carry; carry = s/10; s%=10; ans.append(s); } if( carry > 0 ) ans.append(carry); return ans.length() > 80 ? "overflow" : ans.reverse().toString(); }}; String solve(String a, String b){ return null; } } }