1. 程式人生 > 其它 >assert斷言多個

assert斷言多個

原理

基本思想 :
在埃氏篩法的基礎上,讓每個合數只被它的最小質因子篩選一次,以達到不重複的目的。
關鍵:
if(i%prime[j]==0)break;
理解:

  • 當 i是prime[j]的倍數時,i = k × prime[j],
  • 如果繼續運算 j+1,
    • i × prime[j + 1] = prime[j] × k × prime[j+1]
  • 這裡prime[j]是最小的素因子,當i = k × prime[j+1]時會重複,
  • 所以跳出迴圈。

舉個例子 :

  • i = 8 ,j = 1,prime[j] = 2,

如果不跳出迴圈,

  • prime[j+1] = 3, 8 * 3 = 2 * 4 * 3 = 2 * 12,
    在i = 12時會計算。

程式碼

bool visited[100100];//初始化
long long prime[100100];//儲存素數
int cnt;

void Euler_prime()
{
    memset(visited, true,sizeof (visited) );
    visited[1]=false;
    for(int i=2;i<100100;i++)
    {
        if(visited[i]) prime[cnt++]=i;
        for(int j=0;j<cnt&&i*prime[j]<100100;j++)
        {
            visited[i*prime[j]] = false;
            if(i%prime[j]==0)//關鍵
                break;
        }
    }
}

實戰