1. 程式人生 > >ACM集訓隊第一週

ACM集訓隊第一週

1.字首和

字首和計算可以減少時間複雜度,提高執行速度
對於求每一項均是前幾項總和的情況下的部分幾項和或者某一單項的時候使用
一般寫成ans[i]=ans[i-1]+a[i];

2.EOF

EOF即是end of file的縮寫
=EOF表示檔案結尾,“!=EOF”表示檔案還沒有結束。
用於多組(不定組)資料輸入時
如 while(scanf()!=EOF);

3.雜湊hash

雜湊即定義一個數組來為函式中的資料進行標記
可以用來記錄某資料出現的次數

4.素數打表

素數打表即是運用雜湊的一種形式
意思是對於部分整數將其中所有的非素數全部標記出來
反覆篩選 最後剩餘的未被標記的數字即為素數
相比起一般輸入整數判斷是否為素數,其時間複雜度更低
例如:
輸入若干個數字b(1<=b<=10000) 判斷其是不是素數

#include<stdio.h>
int main()
{
	int a[10000]={0},i,j,b;
	for(i=1;i<=10000;i++)
		for(j=i*i;j<10000;j+=i)
			a[j]=1;
	while(scanf("%d",&b)!=EOF)
	{
		if(a[b]==0)
			printf("%d是素數\n",b);
		else
			printf("%d不是素數\n",b);
	}
	return 0;
}

解析:
先給陣列a賦值為0,然後利用迴圈找出是i倍數的數字進行標記,被標記的數字即為非素數。
然後輸入數字b,判斷a[b]是否被標記,若未被標記,則說明b不是某數倍數,即b的因子只有1和b,那麼b就是素數。