基本数学问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43460822/article/details/98593189

本次学习内容:
在这里插入图片描述
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+1
x +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);
}

猜你喜欢

转载自blog.csdn.net/weixin_43460822/article/details/98593189