《演算法競賽入門經典》學習筆記+程式碼
阿新 • • 發佈:2018-12-21
目錄
第一章 入門
例題
筆記
整/整=整 整/浮=浮/浮=浮
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函式