篩數演算法
我試過了,樓主的演算法思想是正確的,只不過程序中出現了三個問題。一樓(bhtzu)提到的是一個,我就不說了。其次,下面的語句應該放在第二個for循環中。
if(j>sqrt(i))
{a[i]=true;
for(x=i+i;x<=n;x=x+i)
a[x]=false;
}
最後,就是if(i%j==0)下面的兩個語句應該用{}(大括弧括住)。改完這些就成了。
Ⅱ excel如何篩選數據進行計算
舉個例子:
意思是:
當E8>=0.9,採用紅色部分,即演算法A --- 這個你已經掌握
關鍵是同時還有一個含義是,當E8<0.9,採用綠色部分演算法,即演算法B或者C
因此,綠色部分的先決條件已經包括:E8<0.9
那麼,綠色部分的含義就是:
當E8>=0.85,且E8<0.9,採用演算法B
當E8<0.85(這時必然也小於0.9),採用演算法C。
因此,以此類推,你就可以繼續寫出公式其他部分了對嗎?
Ⅲ C語言中篩選法是怎麼考慮的,就是分幾個步驟考慮篩選出素數
先解釋一下篩選法的步驟:<1> 先將1挖掉(因為1不是素數)。<2> 用2去除它後面的各個數,把能被2整除的數挖掉,即把2的倍數挖掉。<3> 用3去除它後面的各數,把3的倍數挖掉。<4> 分別用4、5…各數作為除數去除這些數以後的各數。上述操作需要一個很大的容器去裝載所有數的集合,只要滿足上述條件,即2的N次方的全部置0,3的N次方的全部置0,4的N次方的全部置0.。。。一直到這個數據集合的末尾,這樣一來不為0的數就是素數了,然後按下標在裡面進行查找就好了篩選法程序如下 #includeint main() { int x[100001]; int temp,n, i; //初始化數組 for(i=0;i<100001;i++) x[i]=0; //初始化數組完成 /* 預計結果, 數組中質數為0,其它為1 */ x[0]=x[1]=1;//因為 0和1不能通過計算得到,所以只能手工置1 ,1即不是合數也不是質數for(i=2;i<100001;i++) {//循環數組中的每個數 if(x[i]==0){//如果該數所存的值為0,即第一次接觸此數 temp=2*i;//將它的二倍,及n倍(要小於100000) ,都置為1,因為這些數都能被i整除 while(temp<=100000) { x[temp]=1; temp+=i; } } } scanf("%d",&n); while(n != 0) { if(x[n]==0) printf("素數\n"); else printf("合數\n"); scanf("%d",&n); } return 0; }如果你覺得這個方法不好理解,你可以用上面他們寫的那些常規演算法,但是數字過大的話,算起來是很慢的
Ⅳ c語言編程 素數篩選
用篩法求100以內的素數:
#include<stdio.h>
int main()
{
int a[101],i,j;
for(i=2;i<=100;i++)
a[i]=1;
for(i=2;i<=10;i++)
for(j=i+i;j<=100;j+=i)
a[j]=0;
printf("100以內的素數: ");
for(i=2;i<=100;i++)
if(a[i])printf("%d ",i);
printf(" ");
getch();
return 0;
}
Ⅳ 篩子目數怎麼計算
可用:`分割法'計算。
即:先局部後整體,化繁為簡。例如:'田`有幾個`口'?先將口字選,再對照,四口圍成`田'。
算式如下:
1,再求出篩子總面積是多少平方厘米(n)。
2,再求得:目數/c㎡(X)。
3,總目數=n×X=nX。
追答:依此法,應先求得一目是多少。(國家有規定,可查)再除以總目數。
Ⅵ 米勒-羅賓演算法
獻上 素數測試+大數的因素分解 的概率演算法
素數在密碼屆被廣泛使用。
如何判斷一個素是素數,迄今為止最有效的方法是篩數法,做個表(打表法)即素數的倍數一定是合數。篩選法的效率很高,但是遇到大素
數就無能為力了。
米勒羅賓演算法是一個相當著名的判斷是否是素數的演算法,能夠很大概率的判斷一個數是否是素數(接近100%,在一定范圍內能達到100%)。
在工程方面被廣泛應用。
米勒羅賓演算法的核心是課上提到的費馬小定理:
即如果一個數n 它的 a^(n-1)%n !=1 (0<a<n) 則它一定是合數。
如果 a^(n-1)%n ==1 (0<a<n) 則它可能是合數可能是素數。概率演算法的概率就在這個 a上體現。
/*
1 隨機取一個 a
2 如果 它不滿足 a^(n-1)%n ==1
3 則它一定是 合數
4 退出
5 如果它滿足 a^(n-1)%n ==1
6 則它是一個素數的概率是1/2
7 回到 1
*/
如果對這個過程重復50次,每次都沒說它是合數,那這個數是素數的概率是多少那?
它只有(1/2)^50可能不是素數!
很顯然就像是投硬幣那樣如果你投了1000次,每次都投到正面 ,那你就會懷疑這個硬幣2面都是正面!
米勒羅賓演算法的演算法很簡單,但是由於需要計算a^(n-1)%n這類的問題,如果不經行優化,對於大數計算時間復雜度仍舊很高。
下面Witness(long a,long n)這個函數就是用java實現的a^(n-1)%n的比較快速的大數計算。
Witness計算的核心是"模運算"
/*
把a 分解成 t個2 和 奇數u的乘積 ,比如 144 可以分解成4個2 和一個9的乘積
於是根據"模運算",我們可以把計算a^(n-1)%n,分解成計算 4次(a^2)迭代計算和a^9%n的計算
對於4次(a^2)迭代計算,只需一個for,執行 t次
對於a^9%n的計算可參考Molar_Exponentiation(long a, long b,long n)實現
具體方法為
/*
定義一個數d為結果,初始值為1
將9化為2進制1001(2^0方位是第一位)共四位
則做四次操作
d=d*d%n
如果當前位為1則再做
d=d*a%n
*/
*/
以上演算法其實就是第一次課堂練習最後道題的演算法!
當然整個演算法還有許多細節:
1比如2個64位整數的乘積超過64位,會產生溢出。解決這個問題的方法有3個
1)使用匯編寫大數乘法和模
2)使用數組編寫大數
3)使用JAVA,Java有大數類,方便實惠!所以這次開始用c++寫,後來改成了java
2隨機數的產生,盡量產生足夠長的奇數,效果好!
3實現可以做張素數表,加速計算,我就實現打了張1900個素數的大表!大家不要鄙視打表,在計算機中很常用的。
當然米勒羅賓演算法只能判斷它是否是素數,但如果知道了它不是素數後,則么樣才能得到它的因數那?
正常的演算法是O(logn)的,當然有更快的演算法"POLLARD啟發式搜索"
這個演算法我看了一個好長時間才看懂的。核心是中國剩餘定理!相當巧妙!
這個演算法是啟發式的,不一定能在有限時間內找到,需要寫的很好才不會遇到偶爾死循環的情況。
要優化可以考慮優化gcd的計算。這個演算法我寫的方法還有很多漏洞,相當不完善,自己功力也不夠解釋清楚。
大家有興趣的話還是自己看書吧,祝能看懂!
當然還有留下點以為,對於分解因數有更巧妙的辦法嗎?
Ⅶ C語言在數組中篩選數處理
#include"stdio.h"
#defineN100
intmain(intargc,charconst*argv[])
{
inta[N],i,j;
for(i=0;i<N;++i)
{
scanf("%d",a+i);
}
for(i=0;i<N;i++)
{
for(j=i+1;j<N;++j)
{
if(a[i]%2==1&&a[j]%2==1&&a[i]>a[j])
{
a[i]=a[i]-a[j];
a[j]=a[i]+a[j];
a[i]=a[j]-a[i];
}
}
}
for(i=0;i<N;++i)
{
if(i%10==0)printf(" ");
printf("%d",a[i]);
}
return0;
}
以上演算法基於選擇排序演算法
可將N設置為10 ,進行測試
Ⅷ 求教一個數據篩選的演算法
怎麼發現在這里問問題的人都惜墨如金,只寫個題目,生怕再多寫一個字出來?你至少應該描述描述你的問題
Ⅸ 篩網目數是怎麼計算的
目數的計算方法:25.4/(絲徑+孔徑)=目數
篩網目數是指在一英寸(25.4mm )的長度,一共有多少個孔排列,就是多少目。並不是25.4平方毫米,而是在這個長度的一列。比如一個田字形,最左邊的兩個孔總共長度是25.4,那麼就是兩目,而不是四目。
Ⅹ 什麼是篩法(數論中古老的方法)
在數論中有廣泛應用的一個初等方法,起源於古老的埃拉托斯特尼篩法。所謂篩法,可描述如下: ①給定「被篩集合」。這是依賴於某一參數□ 的集合族□(□),□□□□□。每一集合□(□)由有限個(可重復的)整數組成,且當□ →∞時元素個數也趨於無窮。②給定「篩」。這是由無限多個不同的素數組成的集合□ 以及對每一□ □□□□ 給定□(□)個模□的不同的剩餘類□(□)所組成,其中1≤□(□)<□。③進行「篩選」。給定正數□>2,把集合□(□)中屬於剩餘類□(□)的所有元素都去掉,其中□≤□,□□□□□。剩下的元素所組成的□(□)的子集及其元素個數,均記為□(□(□),□(□),□,□),是□和□的函數,稱之為篩函數。當□(□)僅有一個剩餘類□≡0(mod□)時,篩函數記為□(□(□),□,□)。 選取不同的被篩集合、篩和□,經篩選後,可得到具有不同算術性質的子集,所以許多數論問題有可能用篩法來研究。例如,取參數□為正整數□,□(□)由某些大於1不超過□的整數組成,□是全體素數。再取□=□(整數□≥2)。於是□(□(□),□,□)是由□(□)中所有大於□不超過□,且其素因子都大於□的整數組成。這種整數是不超過□-1個素因數的乘積。當□=2時即是埃拉托斯特尼篩法。 又如,設□、□是正整數。以{□,□}表示命題:每個充分大的偶數是兩個素因數分別不超過□和□個的乘積之和。命題{1,1}基本上就是哥德巴赫猜想。對於這類命題,可取參數□為偶數□,集合□1(□)={□(□-□),2≤□≤□-2},□為全體素數,□=□(整數□≥2)。若能證明對充分大的偶數□ 有□(□1(□ ),□,□)>0,則證明了命題{□-1,□-1}。假若將□1(□)改取為集合□2(□)={□-□,素數□<□□},那麼,根據對充分大的偶數□有□,就可推出命題{1,□-1}。 篩法理論主要是研究篩函數的性質,特別是它的上、下界估計。按照□(□)/□在某種平均意義上是「小」還是「大」,就稱相應的篩法為小篩法或大篩法。以上的例子都是小篩法。大篩法是□.B.林尼克在研究模□的正的最小二次非剩餘時提出來的。 他證明了對任意的篩□和□(□),只要 □就一定有□□□,這里□□(□)={М+□,1≤□≤□ },□1是一正常數,□□(□)是□中不超過□的素數個數。由於□(□)≥□□□是「很大」的,所以林尼克把他的方法稱之為大篩法。 小篩法雖然歷史悠久,但是在數論的具有重要理論價值的研究中,一直沒有得到應用,這主要是由於用它來得到篩函數所需要的上界估計、尤其是正的下界估計十分困難。1920年左右,V.布龍首先對埃拉托斯特尼篩法作了改進,證明了命題{9,9}成立,以及所有孿生素數的倒數組成的級數是收斂的,開辟了應用篩法研究數論的新途徑。他的方法稱為布龍法。40年代,B.J.羅塞改進了布龍篩法,提出了所謂羅塞篩法,但是大約20年後才為人注意。這兩種小篩法理論具有很強的組合數特徵,所以又稱為組合篩法。1950年左右,A.賽爾伯格利用二次型求極值的方法對埃拉托斯特尼篩法又作了重大改進,他的方法稱為賽爾伯格(上界)篩法,十分簡單,便於應用。小篩法在研究命題{□,□}和算術級數中的素數分布(即布龍-蒂奇馬什定理)等許多著名數論問題時,得到了豐富的成果和自身的進一步發展。對小篩法理論作出重要貢獻的還有A.A.布克什塔布引入了組合方法與P.庫恩引入了加權方法。小篩法本身是初等的,但是必需同高深的分析方法相結合才能應用於某些問題的研究,例如命題{1,□}的研究。W.B.朱爾卡特和H.-E.里歇、H.伊瓦尼克等人利用現有的小篩法理論,只在最簡單的情形得到了篩函數的最佳估計。小篩法理論的發展還遠遠沒有完結。 A.雷尼首先於1947年改進了大篩法。1965年,K.F.羅特和E.邦別里又作了重大的改進,雷尼用他的方法估計狄利克雷□函數的零點密度,並結合布龍篩法證明了命題{1,□},這里□是一個未定出的大常數,開辟了應用大篩法的新途徑。E.邦別里發現大篩法可歸結為估計指數和的平方均值 □的上界,其中 □從而使大篩法成為近代解析數論的一個重要工具。1966年,H.達文波特和H.哈伯斯塔姆把大篩法進一步歸為估計 □的上界,式中□□為任意復數,□□大篩法上界估計的證明一直是比較復雜的,1967年,P.X.加拉格爾用極為初等的微積分方法給出一個十分簡單的證明。1974年,H.L.蒙哥馬利和R.C.沃恩利用泛函分析的對偶原理把大篩法歸結為某種雙線性型的估計,證明了最佳估計 □於是大篩法失去原有的神秘面貌而成為一個初等的分析工具,在黎曼□函數、狄利克雷□函數的零點密度估計、算術級數中素數的平均分布以及布龍-蒂奇馬什定理等問題中有重要應用。通常所說的篩法,總是指小篩法而言的。 中國的數學家在小篩法和大篩法的理論及其應用方面都有重要貢獻。1957年,王元證明了命題{2,3}。1962年,潘承洞證明了命題{1,5}。1966年,陳景潤證明了命題{1,2}(證明全文於1973年發表),世界公認是篩法理論最卓越的應用成果,陳景潤在他的一些重要工作中所提出的思想和方法,對近代小篩法的進展有重要的影響。