C/C++基本知识

这篇博客总结了编程竞赛中常见的结果状态,如AC、WA等,并介绍了C/C++的基础知识,包括数据类型、math函数和排序算法。此外,还讲解了指针、结构体的使用以及字符串处理。博客还涉及到了进制转换、日期计算和字符串判断等算法问题。
摘要由CSDN通过智能技术生成

下面只是本人的一些个人总结

常见的一些评测结果

  • 答案正确(Accepted AC)
  • 编译错误(Compile Error CE)
  • 答案错误(Wrong Answer WA)
  • 运行超时(Time Limit Exceeded TLE)
  • 运行错误(Running Error RE)
  • 内存超限(Memory Limit Exceeded MLE)
  • 格式错误(Presentation Error PE)
  • 输出超限(Output Limit Exceeded OLE)

C/C++基本知识

  1. 绝对值在 1 0 9 10^9 109范围以内的整数都可以定义成 int 型
  2. 整数取值范围超过 1 0 10 10^{10} 1010用long long型来存储,如果大于 2 31 − 1 2^{31}-1 2311,在初值后面加上LL
  3. 浮点型的数据都应该使用 double 存储,不要使用float;double 输出格式 %f ,scanf 中是%lf
  4. %md、%0md、%.mf
  5. typedef 给复杂的数据类型起一个别名
typedef long long LL;
  1. 常用math函数
函数说明
fabs(double x)用于对double型的变量取绝对值
floor(double x) 和 ceil(double x)对double型变量的向下、向上取整
pow(double r,double p)返回 r p r^{p} rp,r和p均double型变量
sqrt(double x)返回double型变量的算术平方根
log(double x)返回 double 型变量的以自然对数为底的对数
任意底数求对数换底公式
sin(double x)、cos(double x)、tan(double x)参数要求弧度制
asin(double x)、acos(double x)、atan(double x)反三角函数
round(double x)四舍五入
  1. 冒泡排序
#include<cstdio>
int main(){
	int a[10]={4,1,5,9,2};
	for(int i=1;i<5;i++){//进行n-1趟
		for(int j=0;j<5-i;j++){//一次比较n-i次,都与下一个数比较
			if(a[j]<a[j+1]){
				int temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
			}
		}
	}
	for(int i=0;i<5;i++){
		printf("%d ",a[i]);	//1 2 4 5 9 
	}
}
  1. 数组大小较大( 1 0 6 10^6 106级别)定义在主函数外面
  2. memset(数组名,值,sizeof(数组名));给数组按字节赋相同的值(0或-1)需要添加#include< cstring >
  3. % c能够识别空格跟换行并将其输入,%s 通过空格或者换行来识别一个字符串的结束;gets识别换行符/n作为输入结束
  4. 字符数组末尾都有一个空字符"\0",表示存放的字符串的结尾,使用gets 和 scanf自动添加的,puts 和 printf通过识别"\0"作为结束输出;使用getchar在输入的每个字符串后加入"\0",避免printf 和 puts 输出乱码
  5. 常用的cstring头文件函数
函数功能
strlen(字符数组)得到字符数组中第一个"/0"前的字符个数
strcmp(字符数组1,字符数组2)返回两个字符串大小的比较结果(按字典序)
strcpy(字符数组1,字符数组2)把字符数组2复制给字符数组1,包括结束符\0
strcat(字符数组1,字符数组2)把字符数组2接到字符数组1后面
  1. sscanf 和 sprintf
    sscanf(str,"%d",&n); sprintf(str,"%d".n);
  2. 数组作为函数参数,参数中的数组第一维不需要填写长度,如果是二维数组,第二维需要填写长度,实际调用只需要填写数组名,在函数中对数组元素的修改就等于是对原数组的修改
  3. 使用指针变量作为函数参数,把变量的地址传入函数,即地址中的元素进行改变,原先的数据就会被改变,对传入的地址修改,不会影响原变量
#include<cstdio>

void swap(int* a,int* b){
	int temp = *a;
	*a = *b;
	*b = temp;
} 
int main(){
	int a = 1,b = 2;
	int *p1 = &a,*p2=&b;
	swap(p1,p2);
	printf("a = %d,b = %d\n",*p1,*p2);//a=2,b=1
	printf("a = %d,b = %d\n",a,b);//a=2,b=1
	  
} 
 
  1. 指针的引用
#include<cstdio>
void swap(int* &p1,int* &p2){
	int* temp = p1;
	p1 = p2;
	p2 = temp;
}
int main(){
	int a = 1,b = 2;
	int *p1 = &a,*p2 = &b;
	swap(p1,p2);
	printf("a=%d,b=%d\n",*p1,*p2);//a=2,b=1
	printf("a=%d,b=%d\n",a,b);//a=1,b=2
	 
}
  1. 结构体(struct)
struct Name{
	//一些基本的数据结构或者自定义的数据类型
};//定义结构体变量和结构体数组

struct studentInfo{
	int id;
	char name[20];
	studentInfo n;//不能定义studentInfo型变量
	studentInfo* next; //可以定义studentInfo*型指针变量
}stu,*p;
// 访问stu中的变量
stu.id
stu.name
stu.next
// 访问*p中的变量
(*p).id
(*p).name
(*p).next
p->id
p->name
p->next

#include<cstdio>
struct Point{
	int x,y;
	Point(){}
	Point(int _x,int _y):x(_x),y(_y){}
}pt[10];
int main(){
	int num = 0;
	for(int i=1;i<=3;i++){
		for(int j=1;j<=3;j++){
			pt[num++] = Point(i,j);//直接使用构造函数 
		}
	}
	for(int i=0;i<num;i++){
		printf("%d,%d\n",pt[i].x,pt[i].y);
	} 
	return 0;
}
/*
1,1
1,2
1,3
2,1
2,2
2,3
3,1
3,2
3,3
*/
 
  1. 浮点数比较 与圆周率
const double eps = 1e-8;
const double Pi = acos(-1,0); 
#define Equ(a,b)( (fabs( (a)-(b) )) < (eps) )
#define More(a,b)( ((a)-(b)) > (eps) )
#define Less(a,b)( ((a)-(b)) < (-eps) )
#define MoreEqu(a,b)( ((a)-(b)) > (-eps) )
#define LessEqu(a,b)( ((a)-(b)) < (eps) )

  1. 多点测试三种常见的输入类型
//while...EOF类型
while ( scanf("%d",&n) !=EOF ){
	……
}
while ( scanf("%s",str) !=EOF ){
	……
}
while ( gets(str) !=NULL ){
	……
}
//while...break类型
//对while...EOF类型的拓展

//while(T--)类型
  1. 多点测试三种常见的输出类型
  • 正常输出
    输出数据是连续的多行
  • 每组数据输出之后都额外加一个空行
    只需要在每组输出结束之后额外输出一个换行符 \n 即可。
  • 两组输出数据之间有个一空行,最后一组数据后面没有空行
    一般是在第三种输入类型while(T–)的情况下,值需要判断T是否已经减小到0来判断是否应当输出额外的换行。
for(int i = 0;i<N;i++){
	printf("%d",a[i]);
	if(i< N-1 )printf(" ");
	else printf("\n");
}

入门模拟

  • 日期求差
#include<cstdio>
int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},
						{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
bool isLeap(int year){
	return ( (year %4 == 0 && year%100 !=0 ) ||(year % 400 ==0));
}
int main(){
	int time1,y1,m1,d1;
	int time2,y2,m2,d2;
	while(scanf("%d%d",&time1,&time2)!=EOF){
		if(time1>time2){
			int temp=time1;
			time1=time2;
			time2=temp;
		}//保证time1小于time2
		y1=time1/10000;m1=time1%10000/100;d1=time1%100;
		y2=time2/10000;m2=time2%10000/100;d2=time2%100;
		
		int ans = 1;
		while(y1<y2||m1<m2||d1<d2){
			d1++;
			if(d1 == month[m1][isLeap(y1)] +1){
				m1++;
				d1=1;
			}
			if(m1 == 13){
				y1++;
				m1=1;
			}
			ans++;
		}
		printf("%d\n",ans); 
	}
	return 0;
}
/*
20130101
20130105
5

*/
  • 进制转换
// p 进制转换 10 进制
int y=0,pro = 1;//在循环中会不断乘p,得到p^0,p^1,p^2……
while(x!=0){
	y = y + ( x%10 ) * pro;
	x = x/10;
	pro = pro * p;
}
// 10 进制转换 Q 进制
int z[40],num = 0;
do{
	z[num++] = y % Q;
	y = y / Q;
}while(y!=0);

#include<cstdio>
const int maxn=10000;
int str[maxn]={0};
int main(){
	int x,y,Q,c;
	scanf("%d%d%d",&x,&y,&Q);
	c = x+y;
	int num=0;
	do{
		str[num++]=c%Q;
		c=c/Q;
	} while(c!=0);
	for(int i=num-1;i>=0;i--){
		printf("%d",str[i]);
	}
	printf("\n");
	return 0;
} 
/*
5 6 2
1011

*/
  • 字符串处理
//判断是否回文串
#include<cstdio>
#include<cstring> 
const int maxn = 256;
bool judge(char str[]){
	int len = strlen(str);
	for(int i=0;i<len/2;i++){
		if(str[i] != str[len-1-i]){
			return false;
		}
	}
	return true;
}
int main(){
	char str[maxn];
	while(gets(str)){
		bool flag = judge(str);
		if(flag==true){
			printf("YES\n");
		}else{
			printf("NO\n"); 
		}
	}
}
  • 说反话
#include<cstdio>
int main(){
	int num = 0;
	char ans[90][90];
	while(scanf("%s",ans[num]) !=EOF ){
		num++;
	}
	for(int i= num-1;i>=0;i--){
		printf("%s",ans[i]);
		if(i>0)printf(" ");
	}
	return 0;
}

#include<cstdio>
#include<cstring>
int main(){
	char str[90];
	gets(str);
	int len = strlen(str),r=0,h=0;
	char ans[90][90];
	for(int i=0;i<len;i++){
		if(str[i] !=' '){
			ans[r][h++]=str[i]; 
		}else{
			ans[r][h]='\0';
			r++;
			h=0;
		}
	}
	for(int i=r;i>=0;i--){
		printf("%s",ans[i]);
		if(i>0)printf(" ");
	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值