本次学习内容:
1、判断闰年
润年规则:四年一闰,百年不润,四百年再润
给出算法:
public class LeapYearQuestion {
static int isLeapYear(int year){
if((year%4==0)&&(year%100!=0)||year%400==0){
return 1;
}else{
return 0;
}
}
public static void main(String[] args){
System.out.print("输出2000~3000的所有闰年\n");
int count=0;
for(int i=2000;i<3000;i++){
if(isLeapYear(i)==1){
System.out.print(i+"\t");
count++;
if(count%10==0){
System.out.println("\n");
}
}
}
}
}
2.多项式计算
2.1一维多项式求值
一个通用的计算多项式的值的算法可以采用递推的方式。首先将多项式可以变形为如下的等价形式:
P(x)=(…((an-1x+an-2x)*x+an-3)x+…+a1)x+a0
通过这个表达式可以看出,只要从里面往外一层一层地按照如下的方式递推,便可以计算得到整个一维多项式的值。
Rn-1 =an-1;
Rk=Rk+1x +ak;
k=n-2,…,1,0
通过一层一层计算后,得到的Ro便是多项式P(x)的值。
一维多项式求值算法:
static double po1D(double a[],int n,double x){
double result = a[n-1];
for(int i=n-2;i>=0;i--){
result=result*x+a[i];
}
return result;
}
实例代码:
public class Polynomial1D {
static double po1D(double a[],int n,double x){
double result = a[n-1];
for(int i=n-2;i>=0;i--){
result=result*x+a[i];
}
return result;
}
public static void main(String[] args) {
double[] a={-15,-7,7,2,-3,7,3};
double[] x={-2.0,-1,0,1,2,2.5};
for(int i=0;i<x.length;i++){
System.out.println("当x="+x[i]+"时,p(x)="+po1D(a,7,x[i]));
}
}
}
3.1 java语言中的随机方法
3.1.1、Math.random()方法,产生的随机数是0~1之间的一个double,我们可以把它乘以一定的数,比如说乘以100,它就是个100以内的随机。
3.1.2、 java.util 包里面提供的Random的类,我们可以新建一个Random的对象来产生随机数,它可以产生随机整数、随机float、随机double、随机long。
3.1.2、 System类中有一个currentTimeMillis()方法,这个方法返回一个从1979年1月1日0点0分0秒到目前的一个毫秒数,返回类型是long,我们可以拿它作为一个随机数。
使用Random产生随机方法如下:
public class Random {
public static void main(String[] args){
java.util.Random r = new java.util.Random();
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
System.out.printf("%3d ",r.nextInt(100));
}
System.out.println();
}
}
}
3.2 【0,1】之间的均匀分布的随机数的算法
首先,设定一个基数base=256.0,以及两个常数 a = 17.0 和 189.0。这里,基数base一般取2的整数倍,常数a和b可以根据经验来随意取。
代码如下:
static double rand(double[] a){
double base,u,v,p,temp1,temp2,temp3;
base=256.0;
u=17.0;
v=189.0;
temp1 = (a[0])*u+v;
temp2 = (int)(temp1/base);
temp3 = temp1-temp2*base;
a[0]=temp3;
p=a[0]/base;
return p;
}
3.3 产生任意范围的随机数
跟上述方法一样,不过在输出出需要构造一下,下面是详细代码:
[m,n]之间的浮点随机数
public class Rand01 {
static double rand(double[] a){
double base,u,v,p,temp1,temp2,temp3;
base=256.0;
u=17.0;
v=189.0;
temp1 = (a[0])*u+v;
temp2 = (int)(temp1/base);
temp3 = temp1-temp2*base;
a[0]=temp3;
p=a[0]/base;
return p;
}
public static void main(String[] args){
double[] a= {5.0};
int m=50.0;
int n=100.0;
System.out.println("产生0~1的随机数如下:");
for(int i=0;i<7;i++){
System.out.printf("%d ",m+(n-m)*rand(a));
}
}
}
3.4【m,n】之间均匀分布的随机整数算法
有了上面的[0,1]之间的均匀分布的随机数算法,如果要得到整数,也非常简单,只要结果取整即可。
实例代码:
public class Rand01 {
static double rand(double[] a){
double base,u,v,p,temp1,temp2,temp3;
base=256.0;
u=17.0;
v=189.0;
temp1 = (a[0])*u+v;
temp2 = (int)(temp1/base);
temp3 = temp1-temp2*base;
a[0]=temp3;
p=a[0]/base;
return p;
}
public static void main(String[] args){
double[] a= {5.0};
int m=50;
int n=100;
System.out.println("产生0~1的随机数如下:");
for(int i=0;i<7;i++){
System.out.printf("%d ",m+(int)((n-m)*rand(a)));
}
}
}
4、复数运算
复数的加减乘除运算:
public class Plural {
//加法
static void cPlus(double a,double b,double c,double d, double[] e, double[] f){
e[0]=a+c;
f[0]=b+d;
}
//减法
static void cJian(double a, double b, double c, double d, double[] e, double[] f){
e[0]=a-c;
f[0]=b-d;
}
//乘法
static void cCheng(double a, double b, double c, double d, double[] e, double[] f){
e[0]=a*c-b*d;
f[0]=a*d+b*c;
}
//除法
static void cShu(double a, double b, double c, double d, double[] e, double[] f){
double sq;
sq = c*c+d*d;
e[0]=(a*c+b*d)/sq;
f[0]=(b*c-a*d)/sq;
}
static void cPowN(double a, double b, int n, double[] e, double[] f){
double result;
int i=0;
e[0]=a;
f[0]=b;
if(n==1){
return ;
}else{
for(i=1;i<n;i++){
cCheng(e[0],f[0],a,b,e,f);
}
}
}
public static void main(String[] args){
double a,b,c,d;
double[] e = {0.0};
double[] f = {0.0};
a=4;b=6;
c=2;d=-1;
cPlus(a,b,c,d,e,f);
System.out.println("( "+a+ "+"+b+"i"+") "+"+"+ "("+c+"+"+d+"i"+") ="+e[0]+"+"+f[0]+"i");
cJian(a,b,c,d,e,f);
System.out.println("( "+a+ "+"+b+"i"+") "+"-"+ "("+c+"+"+d+"i"+") ="+e[0]+"+"+f[0]+"i");
cCheng(a,b,c,d,e,f);
System.out.println("( "+a+ "+"+b+"i"+") "+"*"+ "("+c+"+"+d+"i"+") ="+e[0]+"+"+f[0]+"i");
cShu(a,b,c,d,e,f);
System.out.println("( "+a+ "+"+b+"i"+") "+"/"+ "("+c+"+"+d+"i"+") ="+e[0]+"+"+f[0]+"i");
}
}
5、阶乘
5.1 使用循环来计算阶乘
long fact(int n)
{
int i;
long result=1;
for(i=1;i<=n;i++)
{
result*=i;
}
return result;
}
5.2 使用递归来计算阶乘
long fact(int n){
if(n<=1)
return 1;
else
return n*fact(n-1);
}