蓝桥杯--常用函数杂记

本文介绍了Java编程中的一些核心概念,包括四舍五入的实现、ArrayList的使用、哈希表的操作以及排序算法的应用。讲解了Math.round()方法的原理和注意事项,展示了ArrayList动态数组的功能,如添加、删除和遍历元素。此外,还探讨了二进制与int之间的转换,并展示了如何在哈希表中进行键值对的增删查改。最后,文章通过示例展示了如何使用自定义比较器进行类的排序和数组的排序操作。

四舍五入

Math.round(x)
返回int型
原理是在原数上加0.5后进行下取整,因此对负数进行计算可能会有误差
(下取整 Math.floor)
函数只能取到int型,需要保留小数时可以先倍乘后再除去

public static void main(String[] args) {
		double x = -11.5;
		System.out.println(Math.round(x));
		double y = 5.123;
		System.out.println(Math.round(y));
		System.out.println((double)Math.round(y*10)/10);
		System.out.println((double)Math.round(y*100)/100);

	}
-11
5
5.1
5.12

ArrayList

	List<Integer> l = new ArrayList<>();

动态数组(与Vector功能类似)
一定程度上也可以当做链表来用

public static void main(String[] args) {
		List<Integer> l = new ArrayList<>();
		l.add(1);//添加元素至尾
		l.add(2);
		l.add(3);
		l.add(4);
		l.add(1,5);//添加元素至指定位置,后方元素后移
		System.out.println(l);
		System.out.println(l.size());//返回大小
		System.out.println(l.get(1));//获得指定index元素
		Collections.sort(l);//引入collection类进行排序
		System.out.println(l);
		for(int i:l) {//遍历
			System.out.print(i+" ");
		}
		System.out.println();
		l.remove(1);//移除指定index元素
		System.out.println(l);
	}
[1, 5, 2, 3, 4]
5
5
[1, 2, 3, 4, 5]
1 2 3 4 5 
[1, 3, 4, 5]

格式转换

二进制与int

public static void main(String[] args) {
		int n = 12;
		String s = Integer.toBinaryString(n);//int转二进制字符串
		//或使用Integer.toString(n,2);
		System.out.println(s);
		
		int a = Integer.parseInt(s,2);//二进制字符串转int
		System.out.println(a);
	}
1100
12

String与int

public static void main(String[] args) {
		int n = 12;
		String s = String.valueOf(n);//int转String
		
		String ss = "123";
		int m = Integer.parseInt(ss);//String转int
	}

哈希表

映射关系

	Map<String, Integer> map = new HashMap<>();//构造
	map.put(key, value);//插入元素
	map.get(key);//获得key的value
	map.remove(key);//删除key-value对
	map.isEmpty();//判空
	map.size();//返回大小
	map.containsKey(key);//判断是或否存在key
	map.containsValue(value);//判断是否存在value
	map.keySet();//返回key值的set集合
	map.values();//返回value值的collection集合,可以通过构造函数转为list

针对key值排序时,可以先通过keySet–toArray–Arrays.sort获得新的key数组,再通过get(key)来得到value

	Map<Integer, Integer> map =new HashMap<>();
	Object[] keys = map.keySet().toArray();
	Arrays.sort(keys);
	for(Object i:keys) {
		map.get(i);
	}

针对value排序时,通过map.entrySet()获得enteyset,再建立<Map,Entry<k,v>>类型的list,通过的构造函数转为list,使用list.sort()排序

	Map<Integer, Integer> map = new HashMap<>();
	//获取entryset转list
	List<Map.Entry<Integer, Integer>> list = new ArrayList<Map.Entry<Integer, Integer>>(map.entrySet());
	list.sort(new Comparator<Map.Entry<Integer, Integer>>() {
		@Override
		public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
		//通过getValue获得value值进行排序
			return o2.getValue().compareTo(o1.getValue());
		}
	});
	for(Map.Entry<Integer, Integer> i:list) {
		System.out.println(i);
	}

类的排序

自定义class继承Comparable接口,根据排序需求重写compareTo方法,使用Arrays.sort()进行排序

public class Test {
	static Scanner tab = new Scanner(System.in);
	
	static class Person implements Comparable<Person>{
		String name ;
		int age;
		int score;
		
		public Person(String name, int age, int score) {
			super();
			this.name = name;
			this.age = age;
			this.score = score;
		}

		@Override
		public int compareTo(Person o) {
			//name字典升序
			//return this.name.compareTo(o.name);

			//age升序,age相同时score升序
			if(this.age == o.age)
				return Integer.compare(this.score, o.score);
			return Integer.compare(this.age, o.age);
		}

		@Override
		public String toString() {
			return "Person [name=" + name + ", age=" + age + ", score=" + score + "]";
		}
		
		
	}
	
	public static void main(String[] args) {
		Person[] p = new Person[10];
		p[0] = new Person("Tom",20,98);
		p[1] = new Person("John",19,99);
		p[2] = new Person("Bob",18,97);
		p[3] = new Person("Ailly",19,100);
		p[4] = new Person("Corbon",19,98);
		Arrays.sort(p,0,5);
		for(Person i:p) {
			if(i!=null) {
				System.out.println(i);				
			}
		}
	}
}

sort降序

创建一个类继承Comparator,重写compare方法,在Arrays.sort()中传参
如果常规对int数组进行排序使用sort可以直接使用,但加入comparator参数后必须要使用int数组必须改为Integer

public class Test {
	static Scanner tab = new Scanner(System.in);

	static class MyCompare implements Comparator<Integer> {

		@Override
		public int compare(Integer o1, Integer o2) {
			// TODO Auto-generated method stub
			if (o1 > o2)
				return -1;
			else if (o1 == o2)
				return 0;
			else
				return 1;
			//return o1 > o2 ? -1 :(o1==o2 ? 0 :1);
		}
	}

	public static void main(String[] args) {
		Integer a[] = { 2, 3, 5, 4, 1 };//不能直接使用int
		MyCompare mc = new MyCompare();
		Arrays.sort(a, mc);
		for(int i:a) {
			System.out.print(i+" ");
		}
	}
}
5 4 3 2 1 

交集并集

	Set<Integer> s1 = new HashSet<Integer>();
	Set<Integer> s2 = new HashSet<Integer>();
	s1.add(1);
	s1.add(2);
	s1.add(3);
	s2.add(1);
	s2.add(2);
	s2.add(4);
	
	s1.retainAll(s2);//交集
	System.out.println(s1);
	
	s1.addAll(s2);//并集
	System.out.println(s1);

Floyd 最短路

还是先记个最好混的 ==

	public static void main(String[] args) {
		int n = 10;
		int inf = Integer.MAX_VALUE;
		int map[][] = new int[n][n];
		// 初始化
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				if (i == j)
					map[i][j] = 0;
				else
					map[i][j] = inf;
			}
		}
		
		//读入map...
		
		// Floyd
		for (int k = 1; k <= n; k++) {
			for (int i = 1; i <= n; i++) {
				for (int j = 1; j <= n; j++) {
					if (map[i][j] > map[i][k] + map[k][j])
						map[i][j] = map[i][k] + map[k][j];
				}
			}
		}
	}
<think>嗯,用户问的是C语言中蓝桥杯竞赛常用函数列表。首先,我需要回忆一下蓝桥杯竞赛中常见的题目类型,比如输入输出、字符串处理、数学计算、排序和查找,还有数据结构比如数组和链表。然后,根据这些类型,整理出对应的C标准库函数。 首先,输入输出函数肯定是必须的。比如scanf和printf,还有处理字符的getchar和putchar。然后,字符串处理方面,strlen、strcpy、strcat、strcmp这些基本的函数,可能还有sprintf和sscanf用于格式化和解析字符串。数学函数的话,abs、pow、sqrt这些应该常用,还有随机数相关的srand和rand。排序的话,虽然C标准库有qsort,但竞赛中可能需要手写快排或者归并排序,不过还是应该提到qsort的使用方法。内存操作函数如memset和memcpy在初始化数组或复制数据时很实用。还有时间函数如clock,用来计算程序运行时间,可能用于优化。 接下来,我需要检查用户提供的引用内容。引用[1]中的代码涉及数组操作和条件判断,所以可能需要相关函数。引用[2]提到了Java的库函数,但用户问的是C语言,所以这部分可能参考不大,但可以确认数学函数的重要性。引用[3]中的ArrayList方法是Java的,但C中可以用数组和动态内存分配来模拟,所以可能需要提到malloc和free。 用户可能需要这些函数的具体用法和例子,比如如何用qsort对数组排序,或者如何用sprintf格式化字符串。另外,蓝桥杯题目中常考大数处理,所以可能涉及到位操作或者高精度计算,但标准库可能没有直接的支持,需要手写代码。不过用户问的是常用函数,所以重点还是标准库里的内容。 需要注意C语言和Java的不同,比如字符串处理函数在string.h头文件中,数学函数在math.h,并且需要链接-lm。可能还需要提到文件操作函数,但蓝桥杯常用标准输入输出,所以fopen之类的可能不太常用,但以防万一还是可以简要提及。 最后,要确保回答的结构清晰,分门别类,每个函数给出功能、示例和注意事项。例如,输入输出部分列出函数,字符串处理部分列出相关函数,数学函数、内存操作、排序等。同时,注意事项里提醒头文件和编译选项,比如math.h需要链接-lm,避免用户编译出错。 可能还需要补充一些常见的问题,比如为什么使用qsort时要提供比较函数,或者如何处理字符串的安全问题(虽然竞赛中可能不严格检查,但了解strncpy比strcpy更安全)。此外,动态内存分配的函数如malloc和free在需要动态数组时很重要,但要注意内存泄漏。 总结下来,需要整理出以下几个部分:输入输出、字符串处理、数学函数、内存管理、排序与搜索、时间函数,以及其他实用函数如随机数和位操作。每个部分列出常用函数,示例代码,以及使用时的注意事项。这样用户能够快速查找需要的函数,并了解其基本用法,方便备赛时参考。</think>### C语言蓝桥杯竞赛常用函数列表 以下是C语言在蓝桥杯竞赛中常用的标准库函数分类整理,包含功能说明和示例代码。 --- #### **一、输入输出函数** 1. **`scanf` / `printf`** - **功能**:格式化输入/输出。 - **示例**: ```c int n; scanf("%d", &n); // 输入整数 printf("n=%d", n); // 输出整数 ``` - **注意**:注意格式控制符匹配,如`%lld`用于`long long`类型。 2. **`getchar` / `putchar`** - **功能**:单个字符输入/输出。 - **示例**: ```c char c = getchar(); // 读取一个字符 putchar(c); // 输出一个字符 ``` --- #### **二、字符串处理函数(需包含`<string.h>`)** 1. **`strlen`** - **功能**:计算字符串长度。 - **示例**:`int len = strlen("hello");` 2. **`strcpy` / `strncpy`** - **功能**:复制字符串。 - **示例**:`strcpy(dest, src);` 3. **`strcat` / `strncat`** - **功能**:拼接字符串。 - **示例**:`strcat(str1, str2);` 4. **`strcmp` / `strncmp`** - **功能**:比较字符串。 - **示例**:`if (strcmp(s1, s2) == 0)` 5. **`sprintf` / `sscanf`** - **功能**:格式化字符串到数组或反向解析。 - **示例**: ```c char buffer[100]; sprintf(buffer, "%d", 123); // 将整数转为字符串 sscanf("123", "%d", &n); // 从字符串解析整数 ``` --- #### **三、数学函数(需包含`<math.h>`,编译时加`-lm`)** 1. **`abs` / `fabs`** - **功能**:整数/浮点数绝对值。 - **示例**:`int a = abs(-5);` 2. **`pow`** - **功能**:计算幂次。 - **示例**:`double x = pow(2, 3); // 2^3=8` 3. **`sqrt`** - **功能**:平方根。 - **示例**:`double s = sqrt(9); // 3.0` 4. **`ceil` / `floor`** - **功能**:向上/向下取整。 - **示例**:`ceil(3.2)=4.0`, `floor(3.8)=3.0` --- #### **四、内存操作函数(需包含`<string.h>`)** 1. **`memset`** - **功能**:内存块初始化。 - **示例**: ```c int arr[10]; memset(arr, 0, sizeof(arr)); // 数组初始化为0 ``` 2. **`memcpy`** - **功能**:复制内存块。 - **示例**:`memcpy(dest, src, sizeof(src));` --- #### **五、排序与搜索** 1. **`qsort`(需包含`<stdlib.h>`)** - **功能**:快速排序。 - **示例**: ```c int compare(const void* a, const void* b) { return (*(int*)a - *(int*)b); } int arr[] = {5, 3, 7}; qsort(arr, 3, sizeof(int), compare); ``` - **注意**:需自定义比较函数[^2]。 --- #### **六、动态内存分配(需包含`<stdlib.h>`)** 1. **`malloc` / `free`** - **功能**:动态分配/释放内存。 - **示例**: ```c int* arr = (int*)malloc(n * sizeof(int)); free(arr); ``` --- #### **七、其他实用函数** 1. **`rand` / `srand`(需包含`<stdlib.h>`)** - **功能**:生成伪随机数。 - **示例**: ```c srand(time(NULL)); // 设置随机种子 int num = rand() % 100; // 生成0-99的随机数 ``` 2. **`clock`(需包含`<time.h>`)** - **功能**:计算程序运行时间。 - **示例**: ```c clock_t start = clock(); // 待测代码 clock_t end = clock(); double time = (double)(end - start) / CLOCKS_PER_SEC; ``` --- ### **注意事项** 1. 确保包含对应头文件(如`stdio.h`、`math.h`)。 2. 数学函数编译时需加`-lm`(如`gcc main.c -o main -lm`)。 3. 动态内存分配后需检查是否成功并释放内存。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值