湖南工业大学刷题笔记2.1.81.最大公约数:
1234567891011//辗转相除法int s(int a,int b){ while(a!=0){ int c=a%b; b=a; a=c; } return b;}//最小公倍数:int min=(a*b)/s(a,b);
3.1.1,21.闰年判断条件:
1//年份%400=0 或者 年份%4=0并且年份%100!=0
2.冒泡排序:
1234567891011int s[n];for(int i=0;i<n-1;++i){ for(int j=0;j<n-1-i;++j){ if(s[j]<s[j+1]){ int tmp; tmp=s[j]; s[j]=s[j+1]; s[j+1]=tmp; } }}
4.2.51.寻找完数:
范围对半除找
5.1.5*1.亲密数问题:
12345678//求一个数的约数之和void calculateDivisors() { ...
1.基本数据处理1.在 printf(“”)输出时,如果有**==/==,==”==,==?==**输出时,前面要加上转义字符\才能正确输出。2.int 的数做除法运算时,一般都往 0 取整(向下),如果要向上取整,可以自己做一下 if 判断(要注意什么时候刚好除完,什么时候是小数结果的情况)3.int-%d ,double-%lf ,long long-%lld,float-%f,unsigned long long-%llu==(这个比 longlong 的范围还要大)==4.数据类型的转换1.赋值时的类型转换:赋值号**==右边表达式的类型==**会自动转换为赋值号==左边变量类型==2.算术转换:如果在运算时有多个数据类型,那么他会自动**==由低往高==**转换
如:算术表达式中** ...
北航刷题知识点整集2025.2.2:1.printf的转义字符:在输出一些字符的时候,某些字符是系统默认识别的,需要在前面加上特定的字符才能输出
如:
\ “ ? 这些前面要加上\才能正常输出
**%的前面要再加一个%**才能输出
2.int类型的数做除法运算时的取整:一般都是向下取整,即向0取整
如果想要向上取整,通常用的公式是(a+b-1)/b
1//示例:(5 + 3 -1)/3 = 7/3=2(5/3向上取整为2)
要注意负数的情况
3.数据类型和格式符:1.赋值时如果等号两端是不同的数据类型,那么右边的数据类型在运算结束时会自动向左边的数据类型转换
2.如果在运算的过程中有多个数据类型,它会由下图中的顺序由低往高进行转换:
即先是整数,由短到长,长到极限,再是浮点,浮点之间,单独做比
如:算术表达式中普通整数( int )和无符号整数( unsigned )混合使用,则普通整数将自动转换成无符号整数
隐式转换陷阱:如unsigned int与int运算时,负数会转为大正数。
123int a = -1;unsigned int b = 1;if (a ...
3.函数及应用1.自然常数e(math.h)exp(1)
2.三次方根(math.h)cbrt(x)
3.全错位排序公式:全错位排序(Derangement) 是指一个排列中,所有元素的位置都不与其原位置相同的排列方式。换句话说,对于一个有 n 个元素的排列,要求每个元素都不出现在其原本的位置上。
全错位排序的递推公式对于给定的 n,全错位排序的数目可以通过递推公式来计算,公式为:$$D_n = (n - 1) \times (D_{n-1} + D_{n-2})$$其中:
D_n 表示有 n 个元素的全错位排列数。
D_0 = 1,即零个元素的全错位排列数为 1(通常定义为1)。
D_1 = 0,即一个元素没有全错位排列。
4.while中用于没给出具体循环个数但要读取数的情况:~scanf("%d", &n) 是一个常见的用法,通常用于读取整数输入直到输入结束。让我们详细分析一下这个表达式的含义。
scanf 的返回值scanf 函数用于从标准输入读取数据,并将读取到的数据存储到指定的变量中。scanf 的返回值是成功读取的输入项的数量。例 ...
2.结构化编程1.scanf(“”)中不能有任何符号,按照输入格式来,严格。2.看因数3.char *fgets(char *str, int n, FILE *stream);(有时候字符串数组最后还有个结束符’\0’)fgets() 是 C 标准库中的一个函数,用于从文件或标准输入中读取一行字符串,直到遇到换行符、文件结束符(EOF),或者达到最大读取字符数为止。它的定义在 <stdio.h> 中。
这个输入语句可以输入包括空格的,但是scanf不行,scanf遇到空格会停下来
一般使用stream是stdin
参数说明
**str**:用于存储读取内容的字符数组的指针。
**n**:要读取的最大字符数(包括字符串结尾的 \0)。
**stream**:输入流,可以是文件指针(如 stdin)。
返回值
如果成功,返回 str 的地址。
如果遇到文件结束(EOF)或发生错误,返回 NULL。
4.矩形嵌套:要判断三个矩形是否能够完整嵌套,需要满足以下条件:
定义嵌套规则: 一个矩形 AAA 可以嵌套在另一个矩形 BBB 中,当且仅当:
min(A长,A宽)> ...
7.I/O和文件操作1.文件:读取文件:FILE *filea=fopen(“ “)(filea是给这个文件定义的名字,相当于变量名)
关闭文件(最后):fclose(“filea”)
1. 文件的打开 (fopen)fopen 是用来打开一个文件并返回一个文件指针的函数。文件指针是指向文件的一个指针,用来在文件中进行读写操作。
函数原型:12345c复制编辑FILE *fopen(const char *filename, const char *mode);
filename: 要打开的文件名。
mode: 打开文件的模式,决定了你如何读取、写入或修改该文件。
常见的打开模式:
"r": 只读模式。文件必须存在,文件指针指向文件开头。
"w": 只写模式。如果文件存在,文件内容会被清空;如果文件不存在,会创建新文件。
"a": 追加模式。如果文件存在,数据会被写入文件末尾;如果文件不存在,会创建新文件。
"r+": 读写模式。文件必须存在,文件指针指向文件开头。
"w ...
洛谷算法刷题整集2025.2.91.位运算123456789101112131415161718192021222324#include <stdio.h>int main() { unsigned int a=5; // 二进制 0101 unsigned int b=3; // 二进制 0011 //与(&) printf("a & b = %u\n", a & b); // 0001 → 1//对于1而言 //或(|) printf("a | b = %u\n", a | b); // 0111 → 7//对于1而言 //异或(^) printf("a ^ b = %u\n", a ^ b); // 0110 → 6//想通为0,不同为1 //取反(~)(结果与类型位数有关) printf("~a = %u\n", ~a); // 1111 1010(假设32位)→ 4294967290 / ...
洛谷刷题笔记:1.语文成绩
1234567891011121314151617181920//用差分,如果寻常做法会超时int s[]={-1,0,5,2,3,4};//原数组int d[6];int s1[6];d[0]=s[0];//-1for(int i=1;i<n;++i){ d[i]=s[i]-s[i-1];}//现在的d={-1,1,5,-3,1,1}假如要对[1,3]区间(对于d数组的形式)进行操作+1;d[1]+=1;d[3+1]-=1;//-1的原因是因为要覆盖到区间,所以出了区间立马加1,如果大于区间,就不管//现在d={-1,2,5,-3,0,1}//然后对差分数组d进行前缀和操作还原s1[0]=d[0];for(int i=1;i<n;++i){ s1[i]=d[i]+s1[i-1];}//s1={-1,1,6,3,3,4}
2.求和
1//前缀和,合并一下
3.k倍区间
123//首先,单纯用枚举或者前缀和这道题肯 ...
洛谷笔记21.邻接表有关树类型的问题基本上都可以用邻接表来表示
当出现图的连续关系的时候,可以用一个数组adj[i] [i+1]来表示节点i的下面有的根节点
123int adj[i+1][i]//表示i+1(i是从0开始)节点下面的某些节点int adj_size[i+1]//表示i+1节点下方有多少个节点,往往用于上方的遍历,基本同时出现
12345678910111213141516171819202122232425//比如:/*输入:最大数为8,9行1 21 31 42 52 63 74 74 87 8*/int adj[9][8];int adj_size[9];for(int i=1;i<=9;++i){ int x,y; scanf("%d,%d",&x,&y); adj[x][adj_size[x]++]=y;//这样就构造出来了一个邻接表}//注意:这里还要后续对每个节点进行排序for(int i=1;i<=n;++i){ qsort(adj[i],adj ...
北航刷题笔记2.1.15,14,12,91.判断2的幂次数
12345678910//关键是搞出一个数组,把这个数转换为一个二进制数,数组s[32]//如果数组中只有1个1,那就是2的幂int n;//这个数int s[32];int i=0;while(n>0){ s[i]=n%2;//自己脑中想一想,二进制每一位都是当前的余数,想一想二进制的运算过程 i++; n/=2;}
2.直线与圆
123456//这题首先就是直线方程的构造有点麻烦a(x1,y1)b(x2,y2)(y2-y1)x+(x1-x2)y+x2*y1-x1*y2=0;d=|ax3+by3+c| ----------- 根号(a^2+b^2)
3.方向判断
1//关键是atan2(y,x)返回的是弧度,而且是[-pi,pi]
4.重逢时刻
1234567891011int h = n % 12;double total_minutes = (30.0 * h) / 5.5; //分针追赶时针所需时间,这里可以看成60/11int min = (int)total_m ...