下面只是本人的一些个人总结
常见的一些评测结果
- 答案正确(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
0
9
10^9
109范围以内的整数都可以定义成 int 型
- 整数取值范围超过
1
0
10
10^{10}
1010用long long型来存储,如果大于
2
31
−
1
2^{31}-1
231−1,在初值后面加上LL
- 浮点型的数据都应该使用 double 存储,不要使用float;double 输出格式 %f ,scanf 中是%lf
- %md、%0md、%.mf
- typedef 给复杂的数据类型起一个别名
typedef long long LL;
- 常用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) | 四舍五入 |
- 冒泡排序
#include<cstdio>
int main(){
int a[10]={4,1,5,9,2};
for(int i=1;i<5;i++){
for(int j=0;j<5-i;j++){
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
0
6
10^6
106级别)定义在主函数外面
- memset(数组名,值,sizeof(数组名));给数组按字节赋相同的值(0或-1)需要添加#include< cstring >
- % c能够识别空格跟换行并将其输入,%s 通过空格或者换行来识别一个字符串的结束;gets识别换行符/n作为输入结束
- 字符数组末尾都有一个空字符"\0",表示存放的字符串的结尾,使用gets 和 scanf自动添加的,puts 和 printf通过识别"\0"作为结束输出;使用getchar在输入的每个字符串后加入"\0",避免printf 和 puts 输出乱码
- 常用的cstring头文件函数
函数 | 功能 |
---|
strlen(字符数组) | 得到字符数组中第一个"/0"前的字符个数 |
strcmp(字符数组1,字符数组2) | 返回两个字符串大小的比较结果(按字典序) |
strcpy(字符数组1,字符数组2) | 把字符数组2复制给字符数组1,包括结束符\0 |
strcat(字符数组1,字符数组2) | 把字符数组2接到字符数组1后面 |
- sscanf 和 sprintf
sscanf(str,"%d",&n); sprintf(str,"%d".n); - 数组作为函数参数,参数中的数组第一维不需要填写长度,如果是二维数组,第二维需要填写长度,实际调用只需要填写数组名,在函数中对数组元素的修改就等于是对原数组的修改
- 使用指针变量作为函数参数,把变量的地址传入函数,即地址中的元素进行改变,原先的数据就会被改变,对传入的地址修改,不会影响原变量
#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);
printf("a = %d,b = %d\n",a,b);
}
- 指针的引用
#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);
printf("a=%d,b=%d\n",a,b);
}
- 结构体(struct)
struct Name{
};
struct studentInfo{
int id;
char name[20];
studentInfo n;
studentInfo* next;
}stu,*p;
stu.id
stu.name
stu.next
(*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;
}
- 浮点数比较 与圆周率
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) )
- 多点测试三种常见的输入类型
while ( scanf("%d",&n) !=EOF ){
……
}
while ( scanf("%s",str) !=EOF ){
……
}
while ( gets(str) !=NULL ){
……
}
- 多点测试三种常见的输出类型
- 正常输出
输出数据是连续的多行 - 每组数据输出之后都额外加一个空行
只需要在每组输出结束之后额外输出一个换行符 \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;
}
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;
}
int y=0,pro = 1;
while(x!=0){
y = y + ( x%10 ) * pro;
x = x/10;
pro = pro * p;
}
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;
}
#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;
}