首页 > 编程语言 >JAVA学习-四则运算的优化

JAVA学习-四则运算的优化

时间:2022-09-19 17:24:10浏览次数:64  
标签:BigInteger JAVA Scanner int 四则运算 System ra new 优化

在这一节中要对上次写的用random函数的应用生成的四则运算程序进行优化,要求是需要实现在线答题,并且可以给出题目的答案讲错题存起来,可以进行错题重做,还要给出错题率以及相同题目做错的次数。同时要实现超大数据的加减。

将上次的代码改改,吧实现的地方改成方法然后进行调用,这里我上次写的时候用的就是方法但不太全面这次略微小改一下,改成方法的目的是为了后续这个程序变得更加复杂的时候我们的逻辑思路不会受到代码杂乱的影响,要是全写在一个主函数估计出现错误的时候你调试疯了都找不到bug。

对于后面要求的超大数据相互运算以及浮点数的运算的这些属于数据类型的问题比起整个代码的逻辑来说较为简单所以放到最后,我们先用int数据将代码逻辑先通顺的写下来。

分析一下思路,上个程序已经将每道题目都打印出来了,在这里要实现的就是算出每道题的答案,与输入进行对比,然后错的存入到arraylist数组中再计算出错题率然后打印出错题以及答案。

再上一个题中已经实现了打印出题目,我在上一个题目中讲每一道题的数字部分和符号部分分别存到两个数组中去,所以这里就比较好运算,先构造一个函数将这两个数组传进来,在函数中用for循环先提出数字部分的第一个然后if条件判断符号是+-*/在与下一个数字进行运算,将他传到新数组去,这里就是计算答案的函数。

构造一个输入函数,在上一个函数结束时调用输入答案函数这样就能实现边出题边作答,传进来的数字与答案数组进行对比正确就继续错误打印出”答错了!“然后调用函数将错误的题目全部存入ArrayList数组中,方便后续打印出错题。

在打印题目函数中调用存错题的函数,传入两个数组,用字符串相加的方式将数字转化成字符串存进arrarlist数组中。

最后构造一个函数遍历数组。

对于要进行超大数字的运算在计算机中int型占32位long型占64位在输入时long型最大输入10位数无法免租无限大数字的需求,在JAVA中提供一个BigInteger类,支持大整数的加减乘除运算,它类似一个int、char、double这样的数据类型 ,用法与其他数据类型相似,唯一不一样的是他的运算需要用到特定的add、multiuly、相应的函数进行加减乘除,所以我们在程序中将所有int型数据重新定义成BigInteger型运算用相应的函数进行运算即可。还有一点BigInteger函数调用需要加上import java.math.BigInteger;

下面是源代码:

package com.helloworld;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.*;

public class suan {
static ArrayList<String> arr=new ArrayList<String>();
public static void main(String[] args)
{

System.out.println("请输入生成数量");
Scanner r=new Scanner(System.in);
int N=r.nextInt();
System.out.println("请输入一行有多少数:");
Scanner sc=new Scanner(System.in);
int l=sc.nextInt();
System.out.println("请选择是否有乘除法:1/0(是/否)");
Scanner sc1=new Scanner(System.in);
int x=sc1.nextInt();
System.out.println("请输入操作数个数:");
Scanner sc2=new Scanner(System.in);
int x2=sc2.nextInt();//操作数个数
System.out.println("请输入操作数取到的最大:");
Scanner sc3=new Scanner(System.in);
BigInteger x3=sc3.nextBigInteger();
BigDecimal x7=new BigDecimal("1000000000000000000");
System.out.println("请选择是否随机加入括号:1/0(是/否)");
Scanner sc4=new Scanner(System.in);
int x4=sc4.nextInt();//加括号
chuti1(x,N,l,x2,x3,x4);
if(mistick()==1)bianli();//输出错题

int i=0;
}
public static void chuti1(int x, int N,int l,int x2,BigInteger x3,int x4)
{
BigInteger[] ra1=new BigInteger[x2];
BigInteger[] ra=new BigInteger[x2];
String[] rb=new String[x2-1];
String[] rb1=new String[x2-1];
int j;
BigInteger[] an=new BigInteger[N];
for(int i=0;i<N;i++)
{
String s6=" ";

if((i>l&&(i%l==0))||i==l)
{
System.out.println();
}
for(j=0;j<x2;j++)
{
ra1[j]=ra[j]=calulate(x3);
System.out.print(ra[j]);
if(j<(x2-1))
{
rb1[j]=rb[j]=fuhao1(x);

System.out.print(rb[j]);
}
}
System.out.print("= ,");
an[i]=answer(ra,rb,x2);
int p1=judge(an,i,dati());//判断返回值是否正确的,
if(p1==1) System.out.println("回答错误!");
save(an,ra1,rb1,i,p1,x2);

} mistick1(N);//判断错误率的
}
public static BigInteger calulate(BigInteger x3)//随机大数字
{
BigInteger a=new BigInteger(64,new Random());//(int)(Math.random()*x3)+999999999;
return a;
}
public static void save(BigInteger an[],BigInteger ra1[],String rb1[],int i,int p1,int x2)//保存
{
if(p1==1) {
arr.add(string(ra1,rb1,x2)+"="+an[i]);}
}
public static String string(BigInteger ra1[],String rb1[],int x2)//保存
{
int i;
int j=0;
String s1="";
for(i=0;i<x2;i++)
{

if(j==0) {s1=s1+ra1[i];j=1; }
if(j==1&&i!=x2-1) {s1=s1+rb1[i];j=0;}
if(i==x2-1)j=0;
}
return s1;
}
public static int mistick()
{
System.out.println("是否选择查看错题1/0(是/否):");
Scanner s7=new Scanner(System.in);
int a=s7.nextInt();
return a;
}
public static void bianli()
{
int i;
for(i=0;i<arr.size();i++)
{
System.out.println(arr.get(i));
}
}
public static void mistick1(int N)
{
double a=arr.size()*1.0/N;
System.out.println("错误率为:"+a);
//System.out.println(arr.size());
}
public static String fuhao1(int x)
{
String s="";
int p=4;
if(x==1)
{p=4;}
else
{p=2;}
int a=(int)(Math.random()*p)+1;

switch(a)
{
case 1:s="+";break;
case 2:s="-";break;
case 3:s="*";break;
case 4:s="/";break;
}

return s;

}
public static BigInteger dati()
{

BigInteger a;
Scanner s4=new Scanner(System.in);
a=s4.nextBigInteger();
return a;
}
public static int judge(BigInteger an[],int i,BigInteger a)
{
int n=0;
if(an[i]!=a)
{


return 1;
}
else
return 0;
}
public static BigInteger answer( BigInteger ra[],String rb[],int x2)
{
int i,j;
for(i=0;i<x2-1;i++)
{
switch(rb[i])
{
case "+":ra[i+1]=ra[i+1].add(ra[i]);break;
case "-":ra[i+1]=ra[i].subtract(ra[i+1]);break;
case "*":ra[i+1]=ra[i].multiply(ra[i+1]);break;
case "/":ra[i+1]=ra[i].divide(ra[i+1]);break;
}

}

return ra[i];
}


}

 

标签:BigInteger,JAVA,Scanner,int,四则运算,System,ra,new,优化
From: https://www.cnblogs.com/222wan/p/16708346.html

相关文章

  • 新手学习Java的好习惯分享
    1、爱好这个是动力,如果你不爱Java,不爱计算机,而是喜爱游戏,娱乐或者其他的,你不适合做程序员。如果你能在电脑前,一坐就是4-5个小时,你能为了学习而阅读英文的资料......
  • 2 Java内存层面的对象认识
    目录1对象的创建2对象的内存布局3对象的访问定位3.1句柄访问3.2直接指针访问说明:此分析基于HotSpot虚拟机1对象的创建Java对象的创建方式有三种:通过new创建通过......
  • javascript 对象的细节
    对象的集中声明方式//方式一:letstu={ name:'小明',age:'17',study:function(){console.log(this.name+'爱学习')}}//调用方式:stu.name;stu......
  • JAVA接口组成更新与方法引用
    JAVA接口组成更新与方法引用接口组成接口组成更新概述接口的组成常量publicstaticfinal(可以省略)抽象方法publicabstract(可以省略)默认方法(java8......
  • java入门
      成功了编译是javac加那个文件名Hello.java   这个是代码......
  • 南京如何做到停车资源共享最优化
    南京市城市管理局局长金安凡:南京如何做到停车资源共享最优化 近年来,南京市机动车保有量快速增长,截至2020年底,全市机动车已达291万余辆,全市停车泊位总量分布不均......
  • java毕业生就业管理系统 高校毕业生就业服务平台 就业管理系统 高校就业统计系统 java
    ......
  • 力扣92(java&python)-反转链表Ⅱ(中等)
    题目:给你单链表的头指针head和两个整数 left和right,其中 left<=right。请你反转从位置left到位置right的链表节点,返回反转后的链表。示例1:输入:head=......
  • VBA中使用JAVASCRIPT
    PrivateSubCommandButton1_Click()DimjsstrDimsbAsStringDimoSCAsObjectDimiAsIntegerSetoSC=CreateObjectx86("MSScriptControl.ScriptControl")'......
  • Javaweb学习笔记第九弹
    MyBatis案例--环境准备1、依据之前在Navicat建立数据表的方法,新建立一个数据表2、将数据表的相关内容表现在Java文件的实例上:即成员变量和set、get成员方法3、new一个测......