Java蓝桥杯-其他问题

一、日期问题

//1、平闰年
//平年和闰年区别:2月平年有28天,而闰年有29天
//年份能被四整除不能被100整除就是闰年
public static boolean run(int year){
    if(year%4==0&&year%100!=0){
        return true;
    }
    return false;
}
/*
*29or28天的月份:2
*30天的月份:4,6,9,11
*31天的月份:1,3,5,7,8,10,12
*/
//平年月份
public int ping[]={31,28,31,30,31,30,31,31,30,31,30,31};
//闰年月份
public int run[]={31,29,31,30,31,30,31,31,30,31,30,31};
//2、星期
/*
*1个星期共7天
*/
//3、时分秒
/*
*一天有24小时,一个小时有60分钟,一分钟有60秒
*/

二、进制问题(十进制为中转站)

1.其他进制转十进制

//二进制转10进制
Scanner scan=new Scanner(System.in);	
String B=scan.next();
int D=0;
for(int i=0;i<B.length();i++) {
	//D+第i位数*2^(位数-1次方)
	D=D+((int)B.charAt(i)-'0')*(int)Math.pow(2, B.length()-i-1);
}
System.out.print(D);

2. 十进制转其余进制

//10进制转16进制
Scanner scan=new Scanner(System.in);
int D=scan.nextInt();
String H="";
List<Integer> l=new ArrayList<Integer>();
while(D!=0) {
	l.add(D%16);
	D=D/16;
}
for(int i=l.size()-1;i>=0;i--) {
	if(l.get(i)<10) {
		H=H+l.get(i);
	}else {
		//根据ascii码对照表求出对应整形值,最后转换char(96-10+10)=a
		H=H+(char)('a'-10+l.get(i));
	}
}
System.out.print(H);

三、高中和初中数学

1.数列

(1)等差数列(n>=1)

通项:an=a1+(n-1)*d;
前n项和:sn=((a1+an)*n)/2;

(2)等比数列(n>=1)

通项:an=a1*q^(n-1);
前n项和:sn=(a1*(1-q^n))/(1-q);

(3)累加法(n>=1)

an=a(n-1)+f(n)
eg:

an      =a(n-1)+n;

an      =a(n-1)+n;
a(n-1) =a(n-2)+n-1;
......
a3       =a2     +3;
a2       =a1     +2;
相加得:an=a1+s(n-1)=a1+(2+n)(n-1)/2;

2.函数及公式

(1)一次函数(直线):

y=kx+b        k为斜率:函数上任意两点(y2-y1)/(x2-x1)        b:直线在y轴上的y值

(2)圆函数

(x-a)^2+(y-b)^2=r^2,表示圆心为(a,b),半径为r的圆

(3)两点距离公式

p1(x1,y1)        p2(x2,y2)

|p1p2|^2=(x2-x1)^2+(y2-y1)^2;

(4)直角三角形斜边最长

a^2+b^2=c^2

3.排列组合

排列:在n个数中选出m(m<=n)个数,按照一定顺序排成一列.(有序性)
组合:在n个数中选出m(m<=n)个数,排成一列.(无序性)


3 8 5 0 9
在5个数中选出3个数排列数
可以用回溯算法列出每一种结果
排列数:A35=5*4*3=60种
组合数:C35=5*4*3/1*2*3=10种 
 

三、数论

1.概念:

(1)素数(质数):只能被1和他本身整除,即:不能被大于1的或本身分解

(2)最大公约(因)数:指两个或多个整数能共同被整除的最大整数

(3)最小公倍数:指两个或多个整数能同时整除的最小整数

(4)互质:两个数的最大公因数为1,则这两个数互质

(5)同余:整数a和b分别除以m所得余数相同,a ≡ b (mod m)

(6)取模:当a是正整数时,取模就是求余数

2.素数

//1.判断一个数是否为素(质)数
public static boolean isPrime(int n) {
	//1不是素数
	if(n==1) return false;
    
	//能被2整除的不是素数(所有偶数都不是素数)
	if(n%2==0) return false;
	//n为奇数时,奇数不能被偶数整除,所以i+=2
	for(int i=3;i*i<=n;i+=2) {
		if(n%i==0) {
			return false;
		}
	}

	return true;
}
//2.埃氏筛判断前n个数(包含n)是否为素数
//埃氏筛定义:把不大于根号n的所有素数的倍数剔除,剩下的就是素数
Scanner scan=new Scanner(System.in);
//下标代表素数,值代表是否是素数
boolean[] isPrime=new boolean[scan.nextInt()+1];
//初始化,0和1不是素数
isPrime[0]=false;
isPrime[1]=false;
for(int i=2;i<isPrime.length;i++) {
	isPrime[i]=true;
}
int result=0;
for(int i=0;i<isPrime.length;i++) {
	//剔除
	if(isPrime[i]) {
		for(int j=2*i;j<isPrime.length;j+=i) {
			isPrime[j]=false;
		}
		result++;
	}
}
System.out.print(result);

3.最大公约(因)数

//辗转相除法求最大公因数
//1.求2个数的最大公因数
public static int gcd(int a,int b) {
	if(b==0) return a;
	return func(b,a%b);
}
//2.求多个数的最大公因数
int arr[]=new int[5];
int result=arr[0];
for(int i=1;i<5;i++){
    result=func(result,arr[i]);
}
//3.求两个大数的最大公因数
BigInteger big1=new BigInteger("2");
BigInteger big2=new BigInteger("4");
System.out.print(big1.gcd(big2));
//4.求多个大数的最大公因数同理

4.最小公倍数

(1)分解质因数法求最小公倍数(不适合求解最小公倍数)

将两个或多个数分解成若干个质因数,然后将所有不同的质因数(次数为所出现的次数)相乘,若有多个数有相同的质因数,则选择数量最多(次数最多)的来相乘。
求36 270的最小公倍数
36=2*2*3*3
270=2*3*3*3*5
不同的质因数:5
相同的值因数:2,3
2^2+3^3+5^1=540

唯一分解定理(算数基本定理):将一个合数分解成若干个质因数,分解

n=a1^p1+a2^p2+...+an^pn;

n的因子(因数、因式)个数(排列问题)公式:因子个数=(1+p1)*(1+p2)...(1+pn)
比如:4->因子个数有1,2,4        共3个

//将360分解成若干个质因数的乘积
int n=360;
//下标代表质因数,值代表数量,初始为0
int[] arr=new int[n];
//0和1不是质数
for(int i=2;i<arr.length;i++) {
    while(n%i==0) {
		arr[i]++;
		n=n/i;
	}
}
//遍历数组
for(int i=0;i<arr.length;i++) {
	System.out.print("arr["+i+"]="+arr[i]+" ");
}

System.out.println();
//列出质因子
for(int i=0;i<arr.length;i++) {
	if(arr[i]!=0) {
		for(int j=0;j<arr[i];j++) {
			System.out.print(i+" ");
		}
	}
}

System.out.println();

int sum=1;
//计算因子个数(1+q1)(1+q2)...(1+qn)
for(int i=0;i<arr.length;i++) {
	if(arr[i]!=0) {
		sum=sum*(1+arr[i]);
	}
}

System.out.println("因子个数:"+sum);

(2)公式法

gcm(a,b)=a*b/lcd

5.互质

互质的基本性质

(1)若两个数互质,则最大公因数为1,最小公倍数为两数乘积

(2)两个数分别除以他们的最大公因数,他们的商互质

(3)两个数的最小公倍数分别除以这两个数,他们的商互质

(4)两个相邻的自然数互质

(5)两个相邻的奇数互质

(6)通过(4)和(5)得:中间是偶数的3个数互质

6.快速幂和余数运算法则

(a+b)%p=(a%p+b%p)%p

(a-b)%p=(a%p-b%p)%p

(a*b)%p=(a%p*b%p)%p

求一个大数100!的%10007

//1.利用余数的运算法则
int n=100;
int result=1;
for(int i=2;i<=100;i++) {
	result=result*i%10007;
}
System.out.print(result);
//2.利用BigInteger大数字类
BigInteger sum=BigInteger.ONE;
for(long i=2;i<=100;i++) {
	sum=sum.multiply(BigInteger.valueOf(i));
}
System.out.print(sum.mod(BigInteger.valueOf(10007)));

7.求一个数的因子

如果一个整数n能被√n之前的数i整除,则一定存在√n之后一个数b!=i能把n整除:b=n/i;

//求一个数的因子
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
List<Integer> yz=new ArrayList<Integer>();
for(int i=1;i<=Math.sqrt(n);i++){
    if(n%i==0){
        yz.add(i);
        if(n/i!=i){
            yz.add(n/i);
        }
    }
}
for(int x:yz){
    System.out.print(x+" ");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小罗のdiary

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值