《算法笔记》学习日记——C/C++快速入门(上)

2.1 基本数据类型

因为发现自己的算法基础非常差(虽然上过数据结构,但是唯一现在还记得的就是上次用python实现简易计算器的时候用两个栈结构储存数字和运算符),写PAT题的时候经常知道该用什么样的算法,但是不知道该如何用代码去实现它(比如1018.Public Bike Management,很显然一遍Dijkstra是无法达到题目要求的,还需要一次DFS,但是我的DFS函数根本无法下笔去写)。因此,我打算从头开始学《算法笔记》,也就是说,从C语言的基础开始学。然后严格按照一节内容一节练习的方式,训练自己的算法思维。

今天主要学了2.1基本数据类型,因为有C语言的基础,所以基本上都知道,但是看了书之后发现,C++的cin和cout其实比C语言的scanf和printf要慢很多,而且printf也能很方便地使用格式化输出(我第一次了解到格式化输出是自学python的时候,因为大一刚上来老师就用iostream和cin、cout来上课了),主要需要注意的一点是数据的取值范围,如果题目要求的数据范围大于2147483647(即2^31-1)的话,就不能用int型了,而应该声明long long型,并且在赋初值的时候,需要在处置后面加上LL(如果初值大于2^31-1的话)。此外,C语言中可以用%s来直接格式化输出一个字符数组(整个字符数组也就是字符串),以及,在定义无穷大数INF时,可以使用const:const int INF=0x3fffffff;

然后是今日份的练习:
Codeup Contest ID:100000565

//Codeup Contest ID:100000565
//本小节暂无练习题

2.2 顺序结构

因为有基础,所以掌握起来比较快。我觉得比较容易忘记的地方就是:double型的变量在输入时,要用%lf,因为这个我查错查了半天没查出来(汗),另外,%s可以直接读入一整个字符数组并输出一整个字符数组,scanf的时候也不需要用取地址运算符&。

今日份练习:
Codeup Contest ID:100000566

//Codeup Contest ID:100000566
//A:
#include<stdio.h>
int main(){
    printf("This is my first c program!");
    return 0;
}
//B:
#include<stdio.h>
int main(){
    printf("********************\nVery Good! \n********************");
    return 0;
}
//C:
#include<stdio.h>
int main(){
    int a, b, sum;
    a = 123;
    b = 456;
    sum = a+b;
    printf("sum=%d", sum);
    return 0;
}
//D:
#include<stdio.h>
int main(){
	int a, b, sum;
	scanf("%d%d", &a, &b);
	sum = a+b;
	printf("%d", sum);
	return 0;
}
//E:
#include<stdio.h>
#include<math.h>
int main(){
	double a, b, c, r1, r2;
	scanf("%lf%lf%lf", &a, &b, &c);  //double型的scanf是lf,被坑了
	r1 = (-b+sqrt(pow(b,2)-4*a*c))/(2*a);
	r2 = (-b-sqrt(pow(b,2)-4*a*c))/(2*a);
	printf("r1=  %.2f\n", r1);
	printf("r2=  %.2f", r2);
	return 0;
}
//F:
#include<stdio.h>
int main(){
	char str[3];
	scanf("%s", str);
	printf("%s\n", str);
	return 0;
} 

2.3 选择结构

主要是if…else if…else…和switch语句,比较简单,没有什么需要特别注意的地方,所以直接开始做题:
Codeup Contest ID:100000567

//Codeup Contest ID:100000567
//A:
#include<stdio.h>
#include<math.h>
int main(){
	double a, b, c, r1, r2;
	scanf("%lf%lf%lf", &a, &b, &c);
	if(pow(b,2)-4*a*c>=0){
		r1 = (-b+sqrt(pow(b,2)-4*a*c))/(2*a);
		r2 = (-b-sqrt(pow(b,2)-4*a*c))/(2*a);
		printf("r1=  %.2f\nr2=  %.2f", r1, r2);
	}
	else{
		printf("No real roots!");
	}
	return 0;
}
//B:
#include<stdio.h>
int main(){
	double a, b;
	scanf("%lf%lf", &a, &b);
	if(a>b){
		printf("%.2f %.2f\n", b, a);
	}
	else{
		printf("%.2f %.2f\n", a, b);
	}
	return 0;
}
//C:
#include<stdio.h>
int main(){
	double a, b, c, temp;
	temp = 0;
	scanf("%lf%lf%lf", &a, &b, &c);
	if(a>b){
		temp = a;
		a = b;
		b = temp;
	}
	if(a>c){
		temp = a;
		a = c;
		c = temp;
	}
	if(b>c){
		temp = b;
		b = c;
		c = temp;
	}
	printf("%.2f %.2f %.2f", a, b, c);
	return 0;
}
//D:
#include<stdio.h>
int main(){
	double a, b, c, max;
	max = 0;
	scanf("%lf%lf%lf", &a, &b, &c);
	if(a>max){
		max = a;
	}
	if(b>max){
		max = b;
	}
	if(c>max){
		max = c;
	}
	printf("%.0f\n", max);
	return 0;
}
//E:
#include<stdio.h>
int main(){
	double a, b;
	scanf("%lf", &a);
	if(a<=100000){
		b = a*0.1;
	}
	else if(a<=200000){
		b = 100000*0.1+(a-100000)*0.075;
	}
	else if(a<=400000){
		b = 100000*0.1+100000*0.075+(a-200000)*0.05;
	}
	else if(a<=600000){
		b = 100000*0.1+100000*0.075+200000*0.5+(a-400000)*0.03;
	}
	else if(a<=1000000){
		b = 100000*0.1+100000*0.075+200000*0.5+200000*0.03+(a-600000)*0.015;
	}
	else{
		b = 100000*0.1+100000*0.075+200000*0.5+200000*0.03+400000*0.015+(a-1000000)*0.01;
	}
	printf("%.2f\n", b);
	return 0;
}

2.4 循环结构

同样的,书上讲的内容基本上都了解,直接进入练习环节:
Codeup Contest ID:100000568

//Codeup Contest ID:100000568
//A:
#include<stdio.h>
int main(){
	int a, sum;
	a = 100;
	sum = 0;
	while(a>=1){
		sum += a;
		a--;
	}
	printf("%d\n", sum);
	return 0;
}
//B:
#include<stdio.h>
int main(){
	int a, sum;
	a = 100;
	sum = 0;
	do{
		sum += a;
		a--;
	}while(a>=0);
	printf("%d\n", sum);
	return 0;
}
//C:
#include<stdio.h>
int main(){
	int sum;
	sum = 0;
	for(int i=0;i<=100;i++){
		sum += i;
	}
	printf("%d\n", sum);
	return 0;
}
//D:
#include<stdio.h>
int main(){
	int n, sum;
	scanf("%d", &n);
	sum = 0;
	for(int i=0;i<=n;i++){
		sum += i;
	}
	printf("%d\n", sum);
	return 0;
}
//E:
#include<stdio.h>
int main(){
	int n, sum;
	n = 1;
	sum = 0;
	while(1){
		sum += n;
		if(sum>1000) break;
		n++;
	}
	printf("%d\n", n);
	return 0;
}
//F:
#include<stdio.h>
int main(){
	int a, b, c, d;
	a=b=c=d=0;
	for(int i=1;i<=5;i++) printf("%3d", ++a);
	printf("\n");
	for(int i=1;i<=5;i++) printf("%3d", b+=2);
	printf("\n");
	for(int i=1;i<=5;i++) printf("%3d", c+=3);
	printf("\n");
	for(int i=1;i<=5;i++) printf("%3d", d+=4);
	printf("\n");
	return 0;
}
//G:
#include<stdio.h>
#include<math.h>
int main(){
	double pi, sum, a;
	int count;
	a = 1;
	count = 1;
	sum = 0;
	for(int i=0;;i++){
		if(count%2!=0){
			sum += 1/a;
			count++;
			a += 2;
		}
		else{
			sum -= 1/a;
			count++;
			a += 2;
		}
		if(fabs(1/a)<pow(10,-6)) break;
	}
	pi = sum * 4;
	printf("PI=%.8f\n", pi);
	return 0;
}
//H:
#include<stdio.h>
#include<math.h>
int main(){
	int f1, f2, f, n, sum;
	f1 = f2 = 1;
	scanf("%d", &n);
	for(int i=3;i<=n;i++){
		f = f1 + f2;
		f1 = f2;
		f2 = f;
	}
	printf("%d\n", f);
	return 0;
}
//I:
#include<stdio.h>
#include<math.h>
int main(){
	int f1, f2, f;
	double a, b, sum;
	sum = 0;
	f1 = 1;
	f2 = 2;
	a = 5;
	b = 3;
	sum = (double)2/1 + (double)3/2; //注意这里要转成double型,不然结果会出错
	for(int i=3;i<=20;i++){
		sum += a/b;
		f = f1 + f2;
		a += f;
		b += f2;
		f1 = f2;
		f2 = f;
	}
	printf("%.6f\n", sum);
	return 0;
}

2.5 数组

主要是学到了冒泡排序的原理、memset的初始化方法(但是保险起见,最好只用来初始化0或-1),以及最重要的sscanf和sprintf的用法(用于字符串和其他类型之间的转换)。
高级用法可以参考这篇文章:
sscanf函数的高级用法
Codeup Contest ID:100000569

//Codeup Contest ID:100000569
//A:
#include<stdio.h>
#include<math.h>
int main(){
	int a[10];
	int b;
	for(int i=0;i<=8;i++){
		scanf("%d", &a[i]);
	}
	scanf("%d", &b);
	for(int i=0;i<=8;i++){
		if(b<a[i]){
			for(int j=9;j>i;j--){
				a[j] = a[j-1];
			}
			a[i] = b;
			break;
		}
	}
	for(int i=0;i<=9;i++){
		printf("%d\n", a[i]);
	}
	return 0;
}
//B:
#include<stdio.h>
#include<math.h>
int main(){
	int a[10];
	for(int i=0;i<=9;i++){
		scanf("%d", &a[i]);
	}
	for(int i=9;i>=0;i--){
		printf("%d\n", a[i]);
	}
	return 0;
}
//C:
#include<stdio.h>
#include<math.h>
double jc(int n){
	if(n>0){
		int sum=1;
		for(int i=1;i<=n;i++){
			sum *= i;
		}
		return sum;
	}
	else return 1;
}
int main(){
	int n;
	scanf("%d", &n);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=i;j++){
			double result;
			result = jc(i-1)/(jc(j-1)*jc(i-j));
			if(j==1) printf("%.0f", result);
			else printf(" %.0f", result);
		}
		printf("\n");
	}
	return 0;
}
//D:
#include<stdio.h>
#include<math.h>
int main(){
	char str1[100];
	scanf("%s", str1);
	for(int i=0;i<=99;i++){
		if(str1[i]>=65&&str1[i]<=90){
			int ascii;
			ascii = str1[i]+1-65;
			str1[i] = 90-ascii+1;
		}
		if(str1[i]>=97&&str1[i]<=122){
			int ascii;
			ascii = str1[i]+1-97;
			str1[i] = 122-ascii+1;
		}
		if(str1[i]=='\0') break;
	}
	printf("%s", str1);
	return 0;
}
//E:
#include<stdio.h>
#include<math.h>
int main(){
	char str1[100];
	char str2[100];
	gets(str1);
	gets(str2);
	int result;
	for(int i=0;i<=99;i++){
		if(str1[i]==str2[i]) continue;
		else{
			result = str1[i] - str2[i];
			break;
		}
	}
	printf("%d", result);
	return 0;
}
//F:
#include<stdio.h>
#include<math.h>
int main(){
	int a[10];
	for(int i=0;i<=9;i++){
		scanf("%d", &a[i]);
	}
	for(int i=9;i>=0;i--){
		printf("%d\n", a[i]);
	}
	return 0;
}
//G:
#include<stdio.h>
#include<math.h>
int main(){
	int a[20]={1,1};
	for(int i=2;i<=19;i++){
		a[i] = a[i-1] + a[i-2];
	}
	for(int i=0;i<=19;i++){
		printf("%d\n", a[i]);
	}
	return 0;
}
//H:
#include<stdio.h>
#include<math.h>
int main(){
	int a[10];
	for(int i=0;i<=9;i++){
		scanf("%d", &a[i]);
	}
	for(int i=1;i<=9;i++){
		for(int j=0;j<10-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<=9;i++){
		printf("%d\n", a[i]);
	}
	return 0;
}
//I:
#include<stdio.h>
#include<math.h>
int main(){
	int a[2][3];
	int b[3][2];
	for(int i=0;i<=1;i++){
		for(int j=0;j<=2;j++){
			scanf("%d", &a[i][j]);
		}
	}
	//a[i][j]->b[j][i]
	for(int i=0;i<=1;i++){
		for(int j=0;j<=2;j++){
			b[j][i] = a[i][j];
		}
	}
	for(int i=0;i<=2;i++){
		for(int j=0;j<=1;j++){
			if(j==0) printf("%d", b[i][j]);
			else printf(" %d", b[i][j]);
		}
		printf("\n");
	}
	return 0;
}
//J:
#include<stdio.h>
#include<string.h>
int main(){
	char str[3][100];
	char max[100];
	for(int i=0;i<=2;i++){
		scanf("%s", str[i]);
	}
	strcpy(max,str[0]);
	for(int i=0;i<=2;i++){
		int cmp=strcmp(str[i],max);
		if(cmp>0) strcpy(max,str[i]);
	}
	printf("%s", max);
	return 0;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值