葡萄城程序设计大赛
来源:互联网 发布:游族网络是双休么 编辑:程序博客网 时间:2024/04/28 19:46
科学计算器
一开发平台
基于windows 7 +Eclipse开发,采用Java语言编码
二模块及算法
软件简介:自动解析计算表达式,并进行运算返回结果的一个科学计算器程序。
- ①输入和输出
科学计算器的输入为一个类似于“SQRT(1+2)”形式的表达式的字符串,该输入对应的 运算结果为3的平方根。输出结果为一个表示运算结果的字符串,比如说 “1.7320508075688773”
- ②关于输入
输入表达式包含以下类型: 数值常量 ,运算符号 ,数值常量 包括正数和负数。
运算符号 :
支持普通的四则运算符号,包括+-*/,分别对应加减乘除运算
支持模除和乘方运算符号,形如 ”x mod y” 以及 “x ^ y”。
支持括号运算符,用作改变运算优先级,例如 ”1 * (2 + 4)”
数组仅作为参数形式出现在函数参数中,数组由一组数值常量或者
表达式组成,由逗号”,” 分隔,并使用方括号”[]”做为数组的界限标记。 ③功能函数
三角函数,双曲函数和反三角函数
public static double sin(doubie a)//返回角的三角正弦 public static double cos(doubie a)//返回角的三角余弦 public static double tan(doubie a)//返回角的三角正切 public static double asin(doubie a)//返回一个值的反正弦 public static double acos(doubie a)//返回一个值的反余弦 public static double atan(doubie a)//返回一个值的反正切 public static double toRadians(doubie angdeg)//将角度转换为弧度 public static double toDegrees(doubie angrad)//将弧度转换为角度
·
模除运算
Java中模运算是用一个操作数-另一个操作数,直到前面的操作数值小于后一个操 作数值为止,//10-2.1 ——》7.9-2.1——》5.8-2.1——》3.7-2.1——》1.6,结果为1.6 System.out.println(10%2.1); Java中,模运算的符号位取决于前一个操作数,不管后一个操作数的符号 结构为:前一个操作数的符号 前一个操作数的绝对值%后一个操作数的绝对值 System.out.println(10%-3); //1 System.out.println(-10%-3); //-1
3 指数运算
int y=1,i=0; if(b=0) y=1; for(i=1;i<=b;i++) y=y*x; printf("y=%d\n",y);
·4.开方运算
BigInteger b=new BigInteger(num); if(b.compareTo(BigInteger.ZERO)<0) return "不是正数"; String sqrt="0"; //开方结果 String pre="0"; //开方过程中需要计算的被减数 BigInteger trynum; //试商,开放过程中需要计算的减数 BigInteger flag; //试商,得到满足要求减数的之后一个数 BigInteger twenty=new BigInteger("20"); //就是20 BigInteger dividend; ///开方过程中需要计算的被减数 int len=num.length(); //数字的长度 if(len%2==0) //长度为偶数 { for(int i=0;i<len/2;++i) //得到的平方根一定是len/2位 { dividend=new BigInteger(pre+num.substring(2*i,2*i+2)); for(int j=0;j<=9;++j) { trynum=twenty.multiply(new BigInteger(sqrt)).multiply(new BigInteger(j+"")).add(new BigInteger(j+"").multiply(new BigInteger(j+""))); flag=twenty.multiply(new BigInteger(sqrt)).multiply(new BigInteger((j+1)+"")).add(new BigInteger((j+1)+"").multiply(new BigInteger((j+1)+"")));; //满足要求的j使得试商与计算中的被减数之差为最小正数 if(trynum.subtract(dividend).compareTo(BigInteger.ZERO)<=0 &&flag.subtract(dividend).compareTo(BigInteger.ZERO)>0) { sqrt+=j; //结果加上得到的j pre=dividend.subtract(trynum).toString(); //更新开方过程中需要计算的被减数 break; }
5.求给定值 x 的常用对数:log10(x)
· 求给定值 x 的自然对数:ln(x)
logx(y) =loge(x) / loge(y) public double log(double value, double base) { return Math.log(value) / Math.log(base); } 计算100的以10为底的对数就变为非常简单了: double log = Logarithm.log(100, 10); // log is 2.0 512的以2为底的对数是: double log = Logarithm.log(512, 2); // log is 9.0 static public double log2(double value) { return log(value, 2.0); } static public double log10(double value) { return log(value, 10.0); }
6.阶乘运算
java中提供了两个拥有高精度计算了类:BigInteger和BigDecimal
BigInteger:支持任意精度的整数运算
BigDecimal:支持任意精度的定点数,可以进行精确的货币计算
for (int i = 1; i <= SUM; i++) { // new BigDecimal("乘数").multiply(new BigDecimal(“因子")).toString();BigDecimal stra =new BigDecimal(s);BigDecimal end = new BigDecimal(s); //将s转为BigDecimalBigDecimal re = end.multiply(stra); //end*stras = re.toString(); //重新赋值给s
7 统计函数
·
集合的算术平均值:avg([…])
集合的统计:sum([…])
while(reader.hasNextDouble()){ double x=reader.nextDouble(); try{ if(x<0||x>100) x=Integer.parseInt("x<0||x>100"); else{ m=m+1; sum=sum+x; } }
·
· 集合的估算方差:var([…])
· 集合的总体方差:varp([…])
因为样本的个数总是的在不断变化的,确切将是不断递增;如果每次增加,都要重新计算平均值,再按次公式,计算出方差;通过n-1个样本时的方差值,和新增的样本,就能得到此时这N个样本的方差;这样计算量不会变同时保持在一个很小的值,可大大提高程序的计算效率。递推公式如下:
Mn = Mn-1+ (xn - Mn-1)/n
Sn = Sn-1 + (xn - Mn-1)*(xn - Mn) Mn为平均值,初始时: M1 = x1, S1 = 0 (此等式的推导证明,我后面给出),而样本方差 s =Sn/(n - 1)
private int count;// 样本的个数 private double mk;// 平均值 06 private double sk;// Sn 07 private double runVar;// 样本方差 08 09 public RunningVariance() { 10 this(0, 0.0, 0.0); 11 } 12 13 public RunningVariance(int count, double mk, double sk) { 14 this.count = count; 15 this.mk = mk; 16 this.sk = sk; 17 recomputeRunVar(); 18 } 19 20 public double getMk() { 21 return mk; 22 } 23 24 public double getSk() { 25 return sk; 26 } 27 28 29 * 获取运行时样本方差 30 31 32 33 public synchronized double getRunningVariance() { 34 return runVar; 35 } 36 37 38 增加样本 39 40 41 42 public synchronized void addSample(double sample) { 43 if (++count == 1) { 44 mk = sample; 45 sk = 0.0; 46 } else { 47 double oldmk = mk; 48 double diff = sample - oldmk; 49 mk += diff / count; 50 sk += diff * (sample - mk); 51 } 52 recomputeRunVar(); 53 } 54 55 56 移除样本 57 58 59 60 public synchronized void removeSample(double sample) { 61 int oldCount = getCount(); 62 double oldmk = mk; 63 if (oldCount == 0) { 64 throw new IllegalStateException(); 65 } 66 if (--count == 0) { 67 mk = Double.NaN; 68 sk = Double.NaN; 69 } else { 70 mk = (oldCount * oldmk - sample) / (oldCount - 1); 71 sk -= (sample - mk) * (sample - oldmk); 72 } 73 recomputeRunVar(); 74 } 75 76 private synchronized void recomputeRunVar() { 77 int count = getCount(); 78 runVar = count > 1 ? sk / (count - 1) : Double.NaN; 79 // 若需要计算标准差 80 // runVar = count > 1 ? Math.sqrt(sk / (count - 1)) : Double.NaN; 81 } 82 83 public synchronized int getCount() { 84 return count; 85 }
· 集合的估算标准差:stdev([…])
· 集合的总体标准偏差:stdevp([…])
中间数据缓存器MC/MR/MS/M+/M-:M表示Memory,是指一个中间数据缓存器,MC=Memory Clear, MR=Memory Read, MS=Memory Save, M+=Memory Add, M-=Memory inus,可以用一个例子来演示:(7-2) * (8-2)= 先输入7,按MS保存,输入2,按M-与缓存器中的7相减,此时缓存器中的值为5;然后计算8-2,得出结果为6,输入*相乘,按MR读出之前保存的数5,按=得出结果30,算完后按MC清除缓存器
统计模式,这是一种完全不同的计算模式,你不再逐次的输入数据与操作符而得到一个结果,而是先输入一系列已知的数据,然后计算各种统计数据(注意,这里清除之前输入的一组数据的按钮为CAD)。支持的统计数据包括平均值、平方平均值,和,平方和,还有就是标准差(standard deviation),标准差是方差的平方根,用来表示一组数据的离散程度。这里提供了两种标准差的计算方式:
:总体标准差(population standard deviation),其在计算方差的过程当中是除以n的。
:样本标准差(sample standard deviation),其在计算方差的过程中式除以n-1的
- 葡萄城程序设计大赛
- 葡萄城程序设计大赛
- 《我与葡萄城的故事》— 征文大赛
- 程序设计大赛
- 程序设计大赛
- ACM程序设计大赛简介
- 程序设计大赛题目
- 2008程序设计大赛
- 程序设计大赛---骑士巡游
- 程序设计大赛—文字游戏
- 程序设计大赛--约瑟夫问题
- 程序设计大赛---多米诺效应
- 程序设计大赛---医院设备利用
- ACM程序设计大赛概况
- 97世界程序设计大赛
- 转贴 c程序设计大赛
- ACM东北地区程序设计大赛
- 程序设计大赛总结
- 48-PHP5.3的垃圾回收机制
- Android 监听电话---在多页面同时使用不产生影响的解决方法
- 【超强干货分享】蘑菇街App的组件化之路
- 49-内存管理中的cache
- 50-写时复制COW机制
- 葡萄城程序设计大赛
- 51-数组与链表
- swift干货集整理
- Socket 套接字打开链接输出流
- elasticsearch中文分词器IK安装
- 52-使用哈希表API
- leetcode 040 Combination Sum II
- 53-数组操作
- Facebook iOS 应用是如何加速图片显示的?