1. 程式人生 > >《演算法競賽入門經典》學習筆記+程式碼

《演算法競賽入門經典》學習筆記+程式碼

目錄

第一章 入門

例題

筆記

習題

第二章 迴圈

例題

筆記

習題

例題

筆記

習題

第一章 入門

例題

筆記

整/整=整 整/浮=浮/浮=浮

scanf("",**&**) printf("%03d\n", ); printf("\\n");輸出\n

include<math.h> const double pi = acos(-1.0); //儘量用const宣告常數

不要使用標頭檔案conio.h

待解決:P16五個問題

習題 

1-1

#include<stdio.h>
//求三個數的平均數保留三位 
int main(){
	int a,b,c;
	scanf("%d%d%d",&a,&b,&c);
	printf("%.3lf",(a+b+c)/3.0); //整/浮=浮/浮=浮
	return 0;
}

 1-2

#include<stdio.h>
//連續和 
int main(){
	int n;
	scanf("%d",&n);
	printf("%d",(n+1)*n/2); //目標是解決問題 
	return 0;
}

 1-4

#include<stdio.h>
#include<math.h> 
#define PI 3.14159265
//sin/cos
int main(){
	int n;
	double val = PI / 180;    //度數要轉化為弧度!!! 
	scanf("%d",&n);
	printf("sin=%.3lf,cos=%.3lf",sin(n*val),cos(n*val)); 
	return 0;
}

 1-5

#include<stdio.h>
//打折 
int main(){
	int x;
	double y;
	scanf("%d",&x);
	y=95*x;
	if(y>=300)
	    y*=0.85;
	printf("%.2lf",y); 
	return 0;
}

1-6

#include<stdio.h>
//三角形 
int main(){
	int a,b,c;
	scanf("%d%d%d",&a,&b,&c);
	//排序 
	if(b>a){
		int t=a;
		a=b;
		b=t;
	}
	if(c>a){
	    int t=a;
		a=c;
		c=t;	
	}
	if(c>b){
		int t=b;
		b=c;
		c=t;
	}
	
	if((c+b)>a){
		if(a*a==b*b+c*c)    printf("yes");
		else    printf("no");
	}
	else    printf("not a tri");
	return 0;
}

1-7

#include<stdio.h>
//年份 
int main(){
	int n;
	scanf("%d",&n);
	if((n%4==0&&n%100!=0)||n%400==0)    printf("yes");
	else    printf("no"); 
	return 0;
}

第二章 迴圈

例題

筆記

判斷x是否為整數:x==floor(x+0.5) //考慮浮點運算誤差 多次 + - * 後對n取餘,可每步取餘 多組資料注意共用變數的重置 巢狀程式碼塊有同名變數,內層遮蔽外層

continue//直接進行下一次迴圈 break//直接跳出迴圈 在迴圈體中定義的變數,每次執行迴圈體會重新宣告和初始化

int c [-231,231-1]; long long c [-263,263-1]; 1e-6 //10-6

計時器: #include<time.h> time = (double)clock()/CLOCKS_PER_SEC//單位秒,結束時使用

管道echo 20|abc //Windows命令列重定向(區別於I/O流)的比賽程式碼(2-10) while(scanf(“%d”,&x)==1){迴圈體};//輸入結束:Enter Ctrl+Z Enter(win)/Ctrl+D(Linux)

習題

2-1

#include<stdio.h>
//水仙花 
int main(){
	for(int i=100;i<1000;i++){
		int a=i/100;
		int b=i/10%10;
		int c=i%10;
		if(i==a*a*a+b*b*b+c*c*c)  printf("%d ",i);
	}
	return 0;
}

2-2

#include<stdio.h>
//韓信點兵 
int main(){
	int a,b,c,flag=0;
	scanf("%d%d%d",&a,&b,&c);
	for(int i=10+b;i<100;i+=5){
		if(i%3==a&&i%7==c){
			printf("%d ",i);
			flag=1;
			break;
		}  
	}
	if(flag==0) printf("no answer"); 
	return 0;
}
//思考:雖然break可以減少迴圈次數,但是加入flag很麻煩,可不可以用exit?

2-3

int main(){
	int n;
	scanf("%d",&n);
	if(n>20){
		printf("error!");
	}
	else{
		for(int i=0;i<n;i++){
			for(int j=0;j<2*n-i-1;j++){ //j<2*n-i-1減少判斷次數 
				if(j>=i) printf("#");
				else printf(" ");
			}
			printf("\n");
		}
	}
	return 0;
} 

2-4

#include <stdio.h>
int main(){
	int m,n,i=1;
	while(1){
		scanf("%d %d",&n,&m);
		if(m==0&&n==0) break;
		else{
		if(n>m||m>1000000||n<=0) printf("Case %d: Error.",i);
		else{
			float s=0;
			for(int k=n;k<=m;k++)
			    s+=(1.0/k/k);
			printf("Case %d: %.5lf",i,s);
		}
		i++;
	}
	}
	return 0;
} //陷阱是輸入魯棒還是什麼??

2-5

int main(){
    int a,b,c,i=1;
    while(1){
        scanf("%d %d %d",&a,&b,&c);
        if(a0&&b0&&c==0) break;
        else{
            if(a>1000000||b>1000000||c>100) printf(“Case %d: Error.”,i);
            else{
                int s1=a/b;
                for(int j=0;j<=c;j++)
                a*=10;
                int s2=(a/b+5)/10;
                printf(“Case %d: %d.%d”,i,s1,s2);
            }
            i++;
        }
    }
    return 0;
}

第三章 陣列字串

例題

筆記

陣列宣告:稍大一些,必須是常量,大陣列宣告在main外 避免異常 <string.h>memcpy memset函式 標誌變數first 避免多餘空格 ++n n++3-3蛇形填數 sprintf函式

習題