一、日期问题
//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+" "); }