因为发现自己的算法基础非常差(虽然上过数据结构,但是唯一现在还记得的就是上次用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
//本小节暂无练习题
因为有基础,所以掌握起来比较快。我觉得比较容易忘记的地方就是:double型的变量在输入时,要用%lf,因为这个我查错查了半天没查出来(汗),另外,%s可以直接读入一整个字符数组并输出一整个字符数组,scanf的时候也不需要用取地址运算符&。
今日份练习:
Codeup Contest ID:100000566
//Codeup Contest ID:100000566
//A:
#include
int main(){
printf("This is my first c program!");
return 0;
}
//B:
#include
int main(){
printf("********************\nVery Good! \n********************");
return 0;
}
//C:
#include
int main(){
int a, b, sum;
a = 123;
b = 456;
sum = a+b;
printf("sum=%d", sum);
return 0;
}
//D:
#include
int main(){
int a, b, sum;
scanf("%d%d", &a, &b);
sum = a+b;
printf("%d", sum);
return 0;
}
//E:
#include
#include
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
int main(){
char str[3];
scanf("%s", str);
printf("%s\n", str);
return 0;
}
主要是if…else if…else…和switch语句,比较简单,没有什么需要特别注意的地方,所以直接开始做题:
Codeup Contest ID:100000567
//Codeup Contest ID:100000567
//A:
#include
#include
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
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
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
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
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;
}
同样的,书上讲的内容基本上都了解,直接进入练习环节:
Codeup Contest ID:100000568
//Codeup Contest ID:100000568
//A:
#include
int main(){
int a, sum;
a = 100;
sum = 0;
while(a>=1){
sum += a;
a--;
}
printf("%d\n", sum);
return 0;
}
//B:
#include
int main(){
int a, sum;
a = 100;
sum = 0;
do{
sum += a;
a--;
}while(a>=0);
printf("%d\n", sum);
return 0;
}
//C:
#include
int main(){
int sum;
sum = 0;
for(int i=0;i<=100;i++){
sum += i;
}
printf("%d\n", sum);
return 0;
}
//D:
#include
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
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
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
#include
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
#include
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
#include
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;
}
主要是学到了冒泡排序的原理、memset的初始化方法(但是保险起见,最好只用来初始化0或-1),以及最重要的sscanf和sprintf的用法(用于字符串和其他类型之间的转换)。
高级用法可以参考这篇文章:
sscanf函数的高级用法
Codeup Contest ID:100000569
//Codeup Contest ID:100000569
//A:
#include
#include
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
#include
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
#include
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
#include
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
#include
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
#include
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
#include
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
#include
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
#include
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
#include
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;
}