蓝桥杯常用算法合集(JAVA)
目录
1 判断闰年
2 计数月、日或者分钟
3 筛选素数
4 求组合数C(n,m)模板
5 全排列
6 并查集
1 判断闰年
我们知道,(1)如果是整百的年份,能被400整除的,是闰年;(2)如果不是整百的年份,能被4整除的,也是闰年。每400年,有97个闰年。鉴于此,程序可以作以下设计:
第一步,判断年份是否被400整除,能的话,就是闰年。比如1600、2000、2400年是闰年。
第二步,在第一步不成立的基础上,判断年份能否被100整除,如果是,则不是闰年。比如1900、2100、2200年不是闰年。
第三步,在第二步不成立的基础上,判断年份能否被4整除,如果是,则是闰年。比如1996、2004、2008年是闰年。
第四步,在第三步不成立的基础上,则不是闰年。比如1997、2001、2002年不是闰年。
import java.util.Scanner;//插入扫描仪public class runnian{public static void main(String[] args)//Sting[] args别忘了写进来{Scanner s=new Scanner(System.in);//声明扫描仪变量System.out.println("请输入年份");//系统提示输入年份int nianfen=s.nextInt();//取得下一行输入的年份值if(nianfen%400==0){System.out.println(nianfen+"年是闰年");}//判断能否被400整除else if(nianfen%100==0){System.out.println(nianfen+"年不是闰年");}//判断能否被100整除else if(nianfen%4==0){System.out.println(nianfen+"年是闰年");}//判断能否被4整除else{System.out.println(nianfen+"年不是闰年");}}}
2 计数月、日或者分钟
计算日的算法如下,小时分钟和秒就是在此基础上乘以相应的进制即可,月份就是在模板里面month++的时候顺便计数即可。
int syear,smonth,sday; //分别为结束年,月,日int countday(int year,int month,int day){ //分别为开始的年月日 int ans=0; int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; while(1){ if(year==syear&&month==smonth&&day==sday){ break; } day++; if(isleaf(year)&&month==2){ if(day>mon[month]+1){ month++; day=1; } }else{ if(day>mon[month]){ month++; day=1; } } if(month>12){ month=1; year++; } ans++; } return ans;}
3 筛选素数
筛选素数有许多种方法,首先是最简单的O(n^(3/2))的算法
import java.util.Scanner;public class ScannerPrimeNumber {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();boolean[] bs = new boolean[n];for (int i = 2; i < bs.length; i++) {// 从2开始for (int j = i + 1; j < bs.length; j++) {//j=i+1 因为i与j必能除尽,从i+1循环就行。if (j % i == 0) {bs[j] = true;// 因为boolean默认为false,因此在这里不再全赋值为true再把符合条件的值赋值为false// 而直接把符合条件的值赋值为true}}}for (int i = 2; i < bs.length; i++) {// 0和1不是质数,因此从2开始循环if (bs[i] == false) {System.out.println(i);}}}}
4 求组合数C(n,m)模板
long long C(int n,int m){ if(m==0)return1; long long ans=1; for(int i=n;i>n-m;i--)ans*=i; for(int i=m;i>1;i--)ans/=i; return ans;}
5 全排列
vector<vector> permuteUnique(vector& nums) { vector<vector> ret; sort(nums.begin(),nums.end()); do{ ret.emplace_back(nums); }while(next_permutation(nums.begin(),nums.end())); return ret; }
6 并查集
int n,m,cnt=0;int f[10005];int find(int x){ if(f[x]==x)return x; return f[x]=find(f[x]);}void union(int x,int y){ int a=find(x); int b=find(y); if(a!=b){ f[a]=b; cnt++; }}