Java 计算器混合数
我是一个java初学者,尝试制作一个可以接受混合数字和分数的计算器,但它不是计算数值,而是将两者结合起来。(例1+1/2) 答案是11/2 )`导入java.util.Scanner; 公共类计算器{Java 计算器混合数,java,numbers,calculator,fractions,mixed,Java,Numbers,Calculator,Fractions,Mixed,我是一个java初学者,尝试制作一个可以接受混合数字和分数的计算器,但它不是计算数值,而是将两者结合起来。(例1+1/2) 答案是11/2 )`导入java.util.Scanner; 公共类计算器{ public static void main(String[] args) { Scanner Woith = new Scanner(System.in); System.out.println("Welcome to the Calc-O-Lator 9000\nthis calculat
public static void main(String[] args) {
Scanner Woith = new Scanner(System.in);
System.out.println("Welcome to the Calc-O-Lator 9000\nthis calculator is able to\nadd, subtract, mulitiple, divide, and handle exponents of\nFRACTIONS\n\nenter 'quit' when done");
System.out.println("To input a mixed number use an underscore in addition with a slash(ex. 2_1/2), also provide a space between the first number and operator\n and the operator and the second number.");
Boolean on=true;
Scanner console=new Scanner(System.in);String firstNumber = Woith.next();
if (firstNumber.equals("quit")) {
on = false;
System.out.println("goodbye");
} else {
firstNumber = parseFullNumber(firstNumber);
}
String operator = Woith.next();
if (operator.equals("quit")) {
on = false;
System.out.println("goodbye");
} else if (operator.equals("+") || operator.equals("-") || operator.equals("/") || operator.equals("*")) {
} else {
throw new ArithmeticException();
}
String secondNumber = Woith.next();
if (secondNumber.equals("quit")) {
on = false;
System.out.println("goodbye");
} else {
secondNumber = parseFullNumber(secondNumber);
}
int wholeNumber = 0;
int numerator = 0;
int denominator = 0;
System.out.println(calculate(operator , firstNumber, secondNumber, wholeNumber, numerator, denominator));
}
public static String parseFullNumber(String input) {
int wholeNumber = 0;
int numerator = 0;
int denominator = 0;
int underscoreIdx = input.indexOf('_');
int slashIdx = input.indexOf('/');
if (underscoreIdx > -1) {
wholeNumber = Integer.parseInt(input.substring(0, underscoreIdx));
numerator = Integer.parseInt(input.substring(underscoreIdx + 1, slashIdx));
denominator = Integer.parseInt(input.substring(slashIdx + 1, input.length()));
} else {
if (slashIdx > -1) {
numerator = Integer.parseInt(input.substring(0, slashIdx));
denominator = Integer.parseInt(input.substring(slashIdx + 1, input.length()));
} else {
wholeNumber = Integer.parseInt(input);
}
}
return reduce(wholeNumber, numerator, denominator);
}
public static String reduce(int wholeNumber, int numerator, int denominator) {
int absNumerator = Math.abs(numerator);
if (absNumerator > 1) {
int commonFactor = 1;
for (int i = 2; i < Math.min(absNumerator, denominator); i++) {
if (numerator % i == 0 && denominator % i == 0) {
commonFactor = i;
}
}
numerator /= commonFactor;
denominator /= commonFactor;
}
if (absNumerator > denominator) {
int reduction = numerator / denominator;
if (wholeNumber >= 0) {
wholeNumber += reduction;
} else {
wholeNumber -= reduction;
}
numerator %= denominator;
}
if (wholeNumber != 0) {
if (numerator != 0) {
return wholeNumber + "_" + numerator + "/" + denominator;
} else {
return String.valueOf(wholeNumber);
}
} else {
if (numerator != 0) {
return numerator + "/" + denominator;
} else {
return String.valueOf(0);
}
}
}
public static String calculate(String input, String firstNumber,String secondNumber,int wholeNumber,int numerator,int denominator){
if (input.contains ("+"))
{
if(!input.contains("/")){
return ("The answer is "+firstNumber + secondNumber);
}
if (input.contains("/")){
return ("The answer is "+(numerator*denominator)+(numerator*denominator)+"/"+(numerator*denominator));
}
if(input.contains("_")){
return ("The answer is "+wholeNumber+numerator+"/"+denominator);
}
if(input.contains("-")){
if(!input.contains("/")){
return ("The answer is "+firstNumber + secondNumber);
}
if (input.contains("/")){
return ("The answer is "+(numerator*denominator)+"/"+(numerator*denominator));
}
if(input.contains("_")){
return ("The answer is "+wholeNumber+numerator+"/"+denominator);
}
if(input.contains("*")){
if(!input.contains("/")){
return ("The answer is "+firstNumber + secondNumber);
}
if (input.contains("/")){
return ("The answer is "+(numerator*numerator)+"/"+(denominator*denominator));
}
if(input.contains("_")){
return ("The answer is "+wholeNumber+numerator+"/"+denominator);
}
}
}
}
return input;
}
publicstaticvoidmain(字符串[]args){
扫描器Woith=新扫描器(System.in);
System.out.println(“欢迎使用Calc-O-Lator 9000\n此计算器能够\n相加、减法、乘法、除法和处理分数的指数\n\n完成后输入'quit'”);
System.out.println(“要输入一个混合数字,除了使用斜杠(例如2_1/2)外,还要在第一个数字和运算符\n以及运算符和第二个数字之间提供一个空格。”);
布尔开=真;
扫描仪控制台=新扫描仪(System.in);字符串firstNumber=Woith.next();
if(firstNumber.equals(“退出”)){
开=假;
System.out.println(“再见”);
}否则{
firstNumber=parseFullNumber(firstNumber);
}
字符串运算符=Woith.next();
if(运算符等于(“退出”)){
开=假;
System.out.println(“再见”);
}else if(运算符.equals(“+”)|运算符.equals(“-”)|运算符.equals(“/”)|运算符.equals(“*”){
}否则{
抛出新的算术异常();
}
字符串secondNumber=Woith.next();
if(secondNumber.equals(“退出”)){
开=假;
System.out.println(“再见”);
}否则{
secondNumber=parseFullNumber(secondNumber);
}
整数整数=0;
整数分子=0;
int分母=0;
System.out.println(计算(运算符、第一个数字、第二个数字、整数、分子、分母));
}
公共静态字符串parseFullNumber(字符串输入){
整数整数=0;
整数分子=0;
int分母=0;
int下划线EIDX=输入.indexOf(“”“);
int slashIdx=input.indexOf('/');
如果(x>-1){
wholeNumber=Integer.parseInt(input.substring(0,下划线idx));
分子=Integer.parseInt(input.substring(下划线EIDX+1,slashIdx));
分母=Integer.parseInt(input.substring(slashIdx+1,input.length());
}否则{
如果(slashIdx>-1){
分子=整数.parseInt(input.substring(0,slashIdx));
分母=Integer.parseInt(input.substring(slashIdx+1,input.length());
}否则{
wholeNumber=Integer.parseInt(输入);
}
}
返回减缩(整数、分子、分母);
}
公共静态字符串缩减(整数、整数分子、整数分母){
int absNumerator=Math.abs(分子);
如果(分子的绝对值>1){
int公共因子=1;
for(int i=2;i分母){
整数缩减=分子/分母;
如果(整数>=0){
总数量+=减少量;
}否则{
总数量-=减少量;
}
分子%=分母;
}
如果(整数!=0){
if(分子!=0){
返回整数+分子+“/”+分母;
}否则{
返回字符串.valueOf(wholeNumber);
}
}否则{
if(分子!=0){
返回分子+“/”+分母;
}否则{
返回字符串.valueOf(0);
}
}
}
公共静态字符串计算(字符串输入、字符串第一个数字、字符串第二个数字、整数整数、整数分子、整数分母){
if(input.contains(“+”))
{
如果(!input.contains(“/”){
return(“答案是”+firstNumber+secondNumber);
}
if(input.contains(“/”){
返回(“答案是“+(分子*分母)+(分子*分母)+”/“+(分子*分母));
}
if(input.contains(“”)){
返回(“答案是“+整数+分子+”/“+分母”);
}
if(input.contains(“-”){
如果(!input.contains(“/”){
return(“答案是”+firstNumber+secondNumber);
}
if(input.contains(“/”){
返回(“答案是“+(分子*分母)+”/“+(分子*分母));
}
if(input.contains(“”)){
返回(“答案是“+整数+分子+”/“+分母”);
}
if(input.contains(“*”)){
如果(!input.contains(“/”){
return(“答案是”+firstNumber+secondNumber);
}
if(input.contains(“/”){
返回(“答案是“+(分子*分子)+”/“+(分母*分母));
}
if(input.contains(“”)){
返回(“答案是“+整数+分子+”/“+分母”);
}
}
}
}
返回输入;
}
}好吧,除了代码中的其他问题之外,您的问题“1+1/2答案是11/2”来自这里:
if (input.contains("/")){
return ("The answer is "+(numerator*denominator)+(numerator*denominator)+"/"+(numerator*denominator));
}
您所述的输出是正确的,因为这是字符串串联。您确实需要浮点转换,请尝试以下方法:
if (input.contains("/")) {
return ("The answer is "+(numerator*denominator)+((float)(numerator*denominator)/(numerator*denominator)));
}
这是因为您对字符串值使用了“+”运算
e、 g
第一个数字是一种字符串类型,如“1”
第二个数字是一种字符串类型,如“1/2”
在计算方法中,您可以使用以下方式打印答案
如果(!input.contains(“/”){
return(“答案是”+firstNumber+secondNumber);
}
此处将返回字符串值“
答案是11/2“
这就是你所遇到的问题(例如,1+1/2答案是11/2)请具体说明你的问题。你应该学习一些东西