程序設計競賽模板,適用PAT、藍橋杯等。持續更新中...

  • 結構體的初始化
struct Point{
	int x,y;
	Point(){}
	Point(int x1,int y1):x(x1),y(y1){}
	 
}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);
		}
	}
	return 0;
}
  • 將整數數組轉換爲整數
int t(int num[]){
	int sum = 0;
	for(int i =0;i < 4;i++){ //4:整數的位數
		sum = sum*10 + num[i];
	}
	return sum;
}
  • 將整數轉換爲整數數組
int to_array(int n,int num[]){
	for(int i =0;i < 4;i++){//有幾位數i就小於幾
		num[i] = n %10;
		n /= 10;
	}
}
  • 處理字符串的利器sscanf和sprintf
#include<stdio.h>


int main(){
	int n;
	char str[]; 
	sscanf(str,"%d",&n);//將str的內容以%d的格式傳輸到n中(從左到右) 
	sprintf(str,"%d",n);//將n以%d的格式傳輸到str中(從右到左)
	
	return 0;
} 
  • 快速排序
#include<time.h>
#include<stdlib.h>
#include<math.h> 

int partition(int a[],int left,int right){
	int p = (int)(round(1.0*rand()/RAND_MAX*(right-left)+left));
	swap(a[p],a[left]);
	int temp = a[left];
	while(left < right){
		while(left < right && a[right] >= temp)	 right--;
				
		a[left] = a[right];
		while(left < right && a[left] <= temp) left++;
		a[right] = a[left];
	}
	a[left] = temp;
	return left;
}

int quicksort(int a[],int left,int right){
	if(left < right){
		int pos = partition(a,left,right);
		quicksort(a,left,pos-1);
		quicksort(a,pos+1,right);
	}
}
int main(){
	srand((unsigned)time(NULL));
	int a[];//其它根據實際情況進行修改
	quicksort(a,left,right);		
	return 0;
} 
  • 快速冪x^y(x的y次方)
typedef long long LL;
LL binaryPow(LL a,LL b){
	LL ans = 1;
	while(b > 0){
		if(b & 1){
			ans = ans * a; 
		}
		a = a*a;
		b >>=1;
	}
	return ans;
}
int main(){
	LL x,y,ans;
	LL ans = binaryPow(x,y); 
	
	return 0;
}
  • 最大公約數
int gcd(int a,int b){
	if(b == 0) return a;
	else return gcd(b,a%b);
}

簡潔版:
int gcd(int a,int b){
	return !b ? a : gcd(b,a % b);	
}
  • 最大公倍數
int lcm(int a,int b,int d){//d爲a和b的最大公約數 
	
	return a/d*b;//得到a和b的最大公倍數,爲了防止計算數據溢出,所以先除後乘 
} 

  • 判斷素數
素數可以直接用枚舉的方法得出,常用的枚舉時間複雜度爲O(n)O(sqrt(n))
/*常用的兩種枚舉方法*/

 1. 第一種

#include<math.h> 
bool isPrime(int n){
	if(n <= 1) return false;
	int sqrt = (int)sqrt(1.0*n);//因爲sqrt的參數要求是浮點數,所以要乘以1.0
	for(int i = 2;i <= sqrt;i++){
		if(n % i == 0) return false;
	} 
	return true;
	
} 

 2. 第二種

bool isPrime(int n){
	if(n <= 1) return false;
	//當n不是很大 (在10^9內還是可以的),如果太大的話應改爲long long類型 
	for(int i = 2;i * i <= n;i++){
		if(n % i == 0) return false;
	} 
	return true;
	
}

 3. 第三種:介紹的三種代碼中最高效的一種方法:Eratosthenes篩法
 /*
求100以內的素數
*/ 
const int maxn = 101;//表長 
int prime[maxn],num = 0;//prime數組存放100以內的所有素數,num爲素數的個數 
bool p[maxn] = {0};//用來標記p[i]爲是否爲素數,如果是素數,則值爲false,反之則爲true 
void Find_Prime(){
	for(int i = 2;i < maxn;i++){//從2開始,此處一定得是 i < maxn,而不能是 i <= maxn,否則程序一運行就會崩潰 
		if(p[i] == false){//如果i是素數 
			prime[num++] = i;//把素數i存放到prime數組中 
			for(int j = i + i;j < maxn;j += i){
				//篩選所有i的倍數,將其標記爲true,注意此處也不能是 i <= maxn
				p[j] = true;
			}
		}
		
	}
}

此處只寫模板,不過多說明原理,若不清楚原理又想了解,可自行百度原理學習
如果認識作者,可微信向作者詢問

  • 二分查找
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章