当前位置:   article > 正文

蓝桥杯常用算法合集(JAVA)_蓝桥杯算法java

蓝桥杯算法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年不是闰年。
 

  1. import java.util.Scanner;//插入扫描仪
  2. public class runnian
  3. {
  4. public static void main(String[] args)//Sting[] args别忘了写进来
  5. {
  6. Scanner s=new Scanner(System.in);//声明扫描仪变量
  7. System.out.println("请输入年份");//系统提示输入年份
  8. int nianfen=s.nextInt();//取得下一行输入的年份值
  9. if(nianfen%400==0){System.out.println(nianfen+"年是闰年");}//判断能否被400整除
  10. else if(nianfen%100==0){System.out.println(nianfen+"年不是闰年");}//判断能否被100整除
  11. else if(nianfen%4==0){System.out.println(nianfen+"年是闰年");}//判断能否被4整除
  12. else{System.out.println(nianfen+"年不是闰年");}
  13. }
  14. }

2 计数月、日或者分钟

计算日的算法如下,小时分钟和秒就是在此基础上乘以相应的进制即可,月份就是在模板里面month++的时候顺便计数即可。

  1. int syear,smonth,sday; //分别为结束年,月,日
  2. int countday(int year,int month,int day){ //分别为开始的年月日
  3. int ans=0;
  4. int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
  5. while(1){
  6. if(year==syear&&month==smonth&&day==sday){
  7. break;
  8. }
  9. day++;
  10. if(isleaf(year)&&month==2){
  11. if(day>mon[month]+1){
  12. month++;
  13. day=1;
  14. }
  15. }else{
  16. if(day>mon[month]){
  17. month++;
  18. day=1;
  19. }
  20. }
  21. if(month>12){
  22. month=1;
  23. year++;
  24. }
  25. ans++;
  26. }
  27. return ans;
  28. }

3 筛选素数

筛选素数有许多种方法,首先是最简单的O(n^(3/2))的算法

  1. import java.util.Scanner;
  2. public class ScannerPrimeNumber {
  3. public static void main(String[] args) {
  4. Scanner scanner = new Scanner(System.in);
  5. int n = scanner.nextInt();
  6. boolean[] bs = new boolean[n];
  7. for (int i = 2; i < bs.length; i++) {// 从2开始
  8. for (int j = i + 1; j < bs.length; j++) {//j=i+1 因为i与j必能除尽,从i+1循环就行。
  9. if (j % i == 0) {
  10. bs[j] = true;// 因为boolean默认为false,因此在这里不再全赋值为true再把符合条件的值赋值为false
  11. // 而直接把符合条件的值赋值为true
  12. }
  13. }
  14. }
  15. for (int i = 2; i < bs.length; i++) {// 0和1不是质数,因此从2开始循环
  16. if (bs[i] == false) {
  17. System.out.println(i);
  18. }
  19. }
  20. }
  21. }

 4 求组合数C(n,m)模板

  1. long long C(int n,int m){
  2. if(m==0)return1;
  3. long long ans=1;
  4. for(int i=n;i>n-m;i--)ans*=i;
  5. for(int i=m;i>1;i--)ans/=i;
  6. return ans;
  7. }

5 全排列

  1. vector<vector<int>> permuteUnique(vector<int>& nums) {
  2. vector<vector<int>> ret;
  3. sort(nums.begin(),nums.end());
  4. do{
  5. ret.emplace_back(nums);
  6. }while(next_permutation(nums.begin(),nums.end()));
  7. return ret;
  8. }

6 并查集

  1. int n,m,cnt=0;
  2. int f[10005];
  3. int find(int x){
  4. if(f[x]==x)return x;
  5. return f[x]=find(f[x]);
  6. }
  7. void union(int x,int y){
  8. int a=find(x);
  9. int b=find(y);
  10. if(a!=b){
  11. f[a]=b;
  12. cnt++;
  13. }
  14. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/342404
推荐阅读
相关标签
  

闽ICP备14008679号