//package practis;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
private enum CharType {
number, plus, minus, asta, slash, equal;
}
private static final String ERROR_MSG
= "数式が不正です。"; public static void main
(String args
[]) { System.
out.
println(calc
("12+00009="));// 21 System.
out.
println(calc
("+9-1="));// 8 System.
out.
println(calc
("-2-4="));// -6 System.
out.
println(calc
("=12+"));// エラー }
if(!isIllegalArg(calc)) {
return ERROR_MSG;
}
//文字列が正常な場合、計算結果を文字列にして返す
return innerCalc1(calc);
}
private static boolean isIllegalArg
(String arg
) { Pattern pattern = Pattern.compile("^(\\+|-)?.*(\\+|-|\\*|/).*=$");
Matcher matcher = pattern.matcher(arg);
return matcher.find();
}
/**
* 数式を計算して、その結果を文字列で返す。
* @param arg 例:"4+2="
* @return 計算結果の文字列表現 例:"6"
*/
double x = 0;
double y = 0;
CharType operate = null;//演算子
//数式を、数字と演算子に分解する
int max = arg.length();
boolean x_entered = false;
boolean xIsMinus = false;
for(int i = 0; i < max; i++) {
if(i == 0) {
//一文字目が+だった場合、それを無視する
if(arg.charAt(0) == '+') continue;
//一文字目が-だった場合、xを負の数値にするフラグを立てる
if(xIsMinus = arg.charAt(0) == '-') continue;
}
switch(checkCharType(arg.charAt(i))) {
case number:
//数字xを取り出す
if(!x_entered) {
x = x * 10;
} else {
//数字yを取り出す
y = y * 10;
}
break;
case equal://'='の場合
break;
default://足し算なのか、引き算なのか、掛け算なのか、割り算なのか記憶
operate = checkCharType(arg.charAt(i));
//次の数字は数値y
x_entered = true;
break;
}
}
//一文字目が-だった場合、xを負の値にする
if(xIsMinus) x = x * -1;
//取り出した数字と演算子を元に計算を行う
return innerCalc2(x, y, operate);
}
private static CharType checkCharType(char c) {
try {
return CharType.number;
switch(c) {
case '+':
return CharType.plus;
case '-':
return CharType.minus;
case '*':
return CharType.asta;
case '/':
return CharType.slash;
case '=':
return CharType.equal;
default:
throw new AssertionError();
}
}
}
/**
* xとyを計算し、結果を文字列として返す
* @param x
* @param y
* @param operate 演算子
* (CharType.plus, CharType.minus, CharType.asta, CharType.slash のいずれか)
* @return 計算結果
*/
private static String innerCalc2
(double x,
double y, CharType operate
) { double answer = 0;
switch(operate) {
case plus:
answer = x + y;
break;
case minus:
answer = x - y;
break;
case asta:
answer = x * y;
break;
case slash:
answer = x / y;
break;
default://引数が不正
}
return String.
valueOf(answer
); }
}
Ly9wYWNrYWdlIHByYWN0aXM7CgppbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CmltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKCgpwdWJsaWMgY2xhc3MgTWFpbiB7CiAgICBwcml2YXRlIGVudW0gQ2hhclR5cGUgewogICAgICAgIG51bWJlciwgcGx1cywgbWludXMsIGFzdGEsIHNsYXNoLCBlcXVhbDsKICAgIH0KICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9NU0cgPSAi5pWw5byP44GM5LiN5q2j44Gn44GZ44CCIjsKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY2FsYygiMTIrMDAwMDk9IikpOy8vIDIxCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNhbGMoIis5LTE9IikpOy8vIDgKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY2FsYygiLTItND0iKSk7Ly8gLTYKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY2FsYygiPTEyKyIpKTsvLyDjgqjjg6njg7wKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2FsYyhTdHJpbmcgY2FsYykgewogICAgICAgIGlmKCFpc0lsbGVnYWxBcmcoY2FsYykpIHsKICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01TRzsKICAgICAgICB9CgogICAgICAgIC8v5paH5a2X5YiX44GM5q2j5bi444Gq5aC05ZCI44CB6KiI566X57WQ5p6c44KS5paH5a2X5YiX44Gr44GX44Gm6L+U44GZCiAgICAgICAgcmV0dXJuIGlubmVyQ2FsYzEoY2FsYyk7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0lsbGVnYWxBcmcoU3RyaW5nIGFyZykgewogICAgICAgIFBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXihcXCt8LSk/LiooXFwrfC18XFwqfC8pLio9JCIpOwogICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcihhcmcpOwogICAgICAgIHJldHVybiBtYXRjaGVyLmZpbmQoKTsKICAgIH0KCiAgICAvKioKICAgICAqIOaVsOW8j+OCkuioiOeul+OBl+OBpuOAgeOBneOBrue1kOaenOOCkuaWh+Wtl+WIl+OBp+i/lOOBmeOAggogICAgICogQHBhcmFtIGFyZyDkvos6IjQrMj0iCiAgICAgKiBAcmV0dXJuIOioiOeul+e1kOaenOOBruaWh+Wtl+WIl+ihqOePviDkvos6IjYiCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBpbm5lckNhbGMxKFN0cmluZyBhcmcpIHsKICAgICAgICBkb3VibGUgeCA9IDA7CiAgICAgICAgZG91YmxlIHkgPSAwOwogICAgICAgIENoYXJUeXBlIG9wZXJhdGUgPSBudWxsOy8v5ryU566X5a2QCgogICAgICAgIC8v5pWw5byP44KS44CB5pWw5a2X44Go5ryU566X5a2Q44Gr5YiG6Kej44GZ44KLCiAgICAgICAgaW50IG1heCA9IGFyZy5sZW5ndGgoKTsKICAgICAgICBib29sZWFuIHhfZW50ZXJlZCA9IGZhbHNlOwogICAgICAgIGJvb2xlYW4geElzTWludXMgPSBmYWxzZTsKICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKICAgICAgICAgICAgaWYoaSA9PSAwKSB7CiAgICAgICAgICAgICAgICAvL+S4gOaWh+Wtl+ebruOBjCvjgaDjgaPjgZ/loLTlkIjjgIHjgZ3jgozjgpLnhKHoppbjgZnjgosKICAgICAgICAgICAgICAgIGlmKGFyZy5jaGFyQXQoMCkgPT0gJysnKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIC8v5LiA5paH5a2X55uu44GMLeOBoOOBo+OBn+WgtOWQiOOAgXjjgpLosqDjga7mlbDlgKTjgavjgZnjgovjg5Xjg6njgrDjgpLnq4vjgabjgosKICAgICAgICAgICAgICAgIGlmKHhJc01pbnVzID0gYXJnLmNoYXJBdCgwKSA9PSAnLScpIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBzd2l0Y2goY2hlY2tDaGFyVHlwZShhcmcuY2hhckF0KGkpKSkgewogICAgICAgICAgICAgICAgY2FzZSBudW1iZXI6CiAgICAgICAgICAgICAgICAgICAgLy/mlbDlrZd444KS5Y+W44KK5Ye644GZCiAgICAgICAgICAgICAgICAgICAgaWYoIXhfZW50ZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB4ID0geCAqIDEwOwogICAgICAgICAgICAgICAgICAgICAgICB4ID0geCArIEludGVnZXIudmFsdWVPZihTdHJpbmcudmFsdWVPZihhcmcuY2hhckF0KGkpKSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL+aVsOWtl3njgpLlj5bjgorlh7rjgZkKICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHkgKiAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHkgKyBJbnRlZ2VyLnZhbHVlT2YoU3RyaW5nLnZhbHVlT2YoYXJnLmNoYXJBdChpKSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgZXF1YWw6Ly8nPSfjga7loLTlkIgKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ly/otrPjgZfnrpfjgarjga7jgYvjgIHlvJXjgY3nrpfjgarjga7jgYvjgIHmjpvjgZHnrpfjgarjga7jgYvjgIHlibLjgornrpfjgarjga7jgYvoqJjmhrYKICAgICAgICAgICAgICAgICAgICBvcGVyYXRlID0gY2hlY2tDaGFyVHlwZShhcmcuY2hhckF0KGkpKTsKICAgICAgICAgICAgICAgICAgICAvL+asoeOBruaVsOWtl+OBr+aVsOWApHkKICAgICAgICAgICAgICAgICAgICB4X2VudGVyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8v5LiA5paH5a2X55uu44GMLeOBoOOBo+OBn+WgtOWQiOOAgXjjgpLosqDjga7lgKTjgavjgZnjgosKICAgICAgICBpZih4SXNNaW51cykgeCA9IHggKiAtMTsKICAgICAgICAvL+WPluOCiuWHuuOBl+OBn+aVsOWtl+OBqOa8lOeul+WtkOOCkuWFg+OBq+ioiOeul+OCkuihjOOBhgogICAgICAgIHJldHVybiBpbm5lckNhbGMyKHgsIHksIG9wZXJhdGUpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIENoYXJUeXBlIGNoZWNrQ2hhclR5cGUoY2hhciBjKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgSW50ZWdlci52YWx1ZU9mKFN0cmluZy52YWx1ZU9mKGMpKTsKICAgICAgICAgICAgcmV0dXJuIENoYXJUeXBlLm51bWJlcjsKICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewogICAgICAgICAgICBzd2l0Y2goYykgewogICAgICAgICAgICAgICAgY2FzZSAnKyc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENoYXJUeXBlLnBsdXM7CiAgICAgICAgICAgICAgICBjYXNlICctJzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2hhclR5cGUubWludXM7CiAgICAgICAgICAgICAgICBjYXNlICcqJzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2hhclR5cGUuYXN0YTsKICAgICAgICAgICAgICAgIGNhc2UgJy8nOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBDaGFyVHlwZS5zbGFzaDsKICAgICAgICAgICAgICAgIGNhc2UgJz0nOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBDaGFyVHlwZS5lcXVhbDsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiB444GoeeOCkuioiOeul+OBl+OAgee1kOaenOOCkuaWh+Wtl+WIl+OBqOOBl+OBpui/lOOBmQogICAgICogQHBhcmFtIHgKICAgICAqIEBwYXJhbSB5CiAgICAgKiBAcGFyYW0gb3BlcmF0ZSDmvJTnrpflrZAKICAgICAqIO+8iENoYXJUeXBlLnBsdXMsIENoYXJUeXBlLm1pbnVzLCBDaGFyVHlwZS5hc3RhLCBDaGFyVHlwZS5zbGFzaCDjga7jgYTjgZrjgozjgYvvvIkKICAgICAqIEByZXR1cm7jgIDoqIjnrpfntZDmnpwKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGlubmVyQ2FsYzIoZG91YmxlIHgsIGRvdWJsZSB5LCBDaGFyVHlwZSBvcGVyYXRlKSB7CiAgICAgICAgZG91YmxlIGFuc3dlciA9IDA7CiAgICAgICAgc3dpdGNoKG9wZXJhdGUpIHsKICAgICAgICAgICAgY2FzZSBwbHVzOgogICAgICAgICAgICAgICAgYW5zd2VyID0geCArIHk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBtaW51czoKICAgICAgICAgICAgICAgIGFuc3dlciA9IHggLSB5OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgYXN0YToKICAgICAgICAgICAgICAgIGFuc3dlciA9IHggKiB5OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2Ugc2xhc2g6CiAgICAgICAgICAgICAgICBhbnN3ZXIgPSB4IC8geTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0Oi8v5byV5pWw44GM5LiN5q2jCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihhbnN3ZXIpOwogICAgfQp9Cg==