1. 程式人生 > 其它 >機試程式設計總結

機試程式設計總結

技術標籤:PAT教程LeetCode

1.申請陣列

如果陣列大小較大(大概10^6)則需要定義在main函式外,否則會使程式異常退出(因為函式內部申請的區域性變數來自系統棧,即允許申請的空間較小;而函式外部申請的全域性變數來自【靜態儲存區】,即允許申請的空間較大)。

2.scanf的%c和%s

scanf的%c格式時可以讀入空格和換行\n的;%d的輸入則是以空白符(即空格、換行等)作為結束判斷標誌。
字元陣列使用%s格式讀入時的結束標誌:空格、換行符。

#include <stdio.h>
int main(){
    int a;
    char c,str[10];   
    scanf
("%d%c%s",&a,&c,str); printf("a=%d,c=%c,str=%s",a,c,str); system("pause"); }

輸入的結果是:1 a bcd
輸出的結果是:a=1,c= ,str=a
int型變數a遇到空格時停止讀入(a不包含空格);而char型字元變數c(注意不是字串變數)實際是一個空格——%c可以讀入空格;str字串變數為a(a後面即空格——結束)。

3.double

double型變數的輸出格式為%d,而scanf輸入的格式時%ld。
對於浮點型,不要使用float(因為精度只有6~7位),即只要是浮點型就使用double型最保險。

4.無窮大數

const int INF=(1<<30)-1;
const int INF=0x3fffffff

上面兩種寫法都是可以的;注意1<<30必須加括號(因算術運算子的優先順序高於位運算子)。
如果是定義long long型的最大值則是long long inf=(1 long long <<63)-1;
注意:const用來定義常量,如const double pi=3.14;
另一種定義符號常量的方式是:【巨集定義】#define pi 3.14

5.memset賦值

(1)新增標頭檔案#include <string.h>
(2)用memset給陣列賦值全部為0或-1

(因為memset是按位元組賦值,即組成int型的4個位元組都會被賦成相同值——0的二進位制補碼為全0,-1的二進位制補碼為全1)
——memset(陣列名,值,sizeof(陣列名))
(3)若對陣列賦值其他數字(如1)則使用fill函式。

6.字元陣列2種初始化

(1)和普通陣列一樣逐個賦值:char str[15]={'g','m','s'};
(2)直接通過字串初始化(只有初始化可以,其他地方不能這樣直接賦值整個字串):
char str[15]="guomiansheng"
列印則用for迴圈逐個:printf("%c",str[i])

7.用while接收輸入

// 使⽤while接收輸⼊的兩種⽅式
while(scanf("%d", n) != EOF) {}
// 等價於下⾯這種:
//因為EOF⼀般為-1,所以~按位取反-1正好是0,就可以退出迴圈了
//所以也寫成下⾯這種情況
while(~scanf("%d", &n)) {}

如果在自己的編譯器執行後的命令列這樣做會得不到輸出結果(因為計算機一直在等你的輸入結束,你需要在黑框中手動輸入後,用<Ctrl+Z>組合鍵後按鍵來高速系統已經到達了EOF即到達了所謂的“檔案末尾”——這樣系統才會結束while),但是OJ卻能AC,因為OJ會自己判斷輸入檔案有沒有已經讀取完

8.說反話

實現的效果是【輸入】Hello World Here I Come;【輸出】Come I Here World Hello。
——相當於結合了第二條筆記和第七條筆記,用while迴圈接收輸入,一直輸入直到檔案末尾:

#include<cstdio>
int main(){
    int num=0;//單詞的個數
    char ans[90][90];
    while(scanf("%s",ans[num]!=EOF)){//一直輸入直到檔案末尾
        num++;//單詞個數加1
    }
    for(int i=num-1;i>=0;i==){//倒著輸出單詞
        printf("%s",ans[i]);
        if(i>0) printf(" ");
    }
    system("pause");
}

9.sort排序

(1)sort預設是從小到大排序,可以使用cmp改變排序規則;
(2)注意排序cmp寫法,如下面栗子:如果a和b身高不同則按從大到小的身高排序,如果a和b的身高相同則按名字降序排序。
(3)記憶方法:return的“大於”就是按從大到小排列。

struct node{
	string name;
	int height;
};
int cmp(struct node a,struct node b){
	return a.height != b.height ?a.height>b.height:a.name<b.name;
}
sort(v.begin(),v,end(),cmp);

10.字串hash(進位制轉換)

若要一個字串S雜湊對映為一個整數(唯一),26個大寫字母對應到二十六進位制中,即將二十六進位制轉為十進位制,但若字串包含小寫字母則是將五十二進位制轉換為十進位制(若字串包含數字,就將進位制數增大為62):

int hashFunc(char S[],int len){//hash函式,將字串S轉為整數
    int id=0;
    for(int i=0;i<len;i++){//如果len未知,可以用strlen(S)
        if(S[i]>='A'&&S[i]<='Z'){
            id=id*52+(S[i]-'A');
        }else if(S[i]>='a'&&S[i]<='z'){
            id=id*52+(S[i]-'a')+26;
        }
    }
    return id;
}

11.判斷素數

如果n沒有接近int型變數的範圍上界,可這以下這麼寫。這種寫法會當n接近int型變數的範圍上界時導致i*i溢位(n在10^9以內都是安全),解決方法是將i定義為long long型就不會溢位了。

bool isprime(int n){
	if(n<=1) return false;
    for(int i=2;i*i<=n;i++)
        if(n%i==0) return false;
    return true;
}

柳神版本:

bool isprim(int a){
	if(a<=1) return false;
	int Sqrt=sqrt((double)a);
	for(int i=2;i<=Sqrt;i++){
		if(a%i==0)
			return false;
	}
	return true;
}

sqrt函式為一個浮點數開根號,要加<math.h>標頭檔案。

12.