蓝桥杯常用算法合集(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<int>> permuteUnique(vector<int>& nums) {
        vector<vector<int>> 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++;
  }
}

 

  • 3
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
蓝桥杯是中国最大的IT技能竞赛之一,搜索算法是其中一个常见的考点。在蓝桥杯中,搜索算法主要包括深度优先搜索(DFS)和广度优先搜索(BFS)两种常见的算法。 深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。它从根节点开始,沿着一条路径一直向下搜索,直到达到叶子节点或无法继续向下搜索为止,然后回溯到上一个节点,继续搜索其他路径。DFS通常使用递归或栈来实现。 广度优先搜索(BFS)是一种用于遍历或搜索树或图的算法。它从根节点开始,逐层地向外扩展搜索,先访问离根节点最近的节点,然后是离根节点更远的节点。BFS通常使用队列来实现。 在Python中,可以使用递归或者队列来实现DFS和BFS算法。以下是一个简单的DFS和BFS的示例代码: DFS算法示例代码: ```python def dfs(graph, start, visited): visited.add(start) print(start, end=" ") for neighbor in graph[start]: if neighbor not in visited: dfs(graph, neighbor, visited) # 示例图的邻接表表示 graph = { 'A': ['B', 'C'], 'B': ['A', 'D', 'E'], 'C': ['A', 'F'], 'D': ['B'], 'E': ['B', 'F'], 'F': ['C', 'E'] } visited = set() dfs(graph, 'A', visited) ``` BFS算法示例代码: ```python from collections import deque def bfs(graph, start): visited = set() queue = deque([start]) visited.add(start) while queue: node = queue.popleft() print(node, end=" ") for neighbor in graph[node]: if neighbor not in visited: queue.append(neighbor) visited.add(neighbor) # 示例图的邻接表表示 graph = { 'A': ['B', 'C'], 'B': ['A', 'D', 'E'], 'C': ['A', 'F'], 'D': ['B'], 'E': ['B', 'F'], 'F': ['C', 'E'] } bfs(graph, 'A') ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

拉姆哥的小屋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值