c語言素數程序
㈠ 用c語言如何判斷素數
按照如下步驟即可用C語言判斷素數:
1、首先打開visual C++ 6.0,然後點擊左上角的文件,再點擊新建。
㈡ 用C語言編寫判斷一個數是否是素數的程序
1、打開ubuntu並開啟一個終端,輸入命令vim is_prime.c,打開編輯頁面,輸入預處理指令#includestdio.h用於在主函數中調用判斷函數。然後定義一個函數int is_prime(int n),即判斷整數n是否為素數。
2、首先,判斷這個數是否小於2.若是,則直接返回0,即表示它不是一個素數。
3、然後定義中間的因數i,初始值為2。依次使n對i取余數,看n能否整除i,然後令i自增直到i的平方大於n。在這過程中,如果遇到n能整除i,則說明n不是一個素數。如果循環能夠直到i的平方大於n才結束,說明n是一個素數。
4、接下來,我們使用主函數進行測試,使用printf(%d : %dn, n, is_prime(n))的格式進行輸出。如果輸出結果為0,說明不為素數;結果為1,說明是一個素數。
測試的數據依次是2,4,9,15, 17, 23, 25。
5、退出編輯器vim,然後使用gcc編譯並運行它,得到結果。通過結果我們可以看出,預期的結果與我們對於素數的認知是相同的,說明我們的程序編寫沒有錯誤。以下是所有的源代碼:
#include stdio.h
//判斷一個數是否為素數的函數定義
int is_prime(int n)
{
//判斷n是否小於2.若小於則直接返回0
//表示n不是一個素數
if(n
2)
return 0;
//定義一個中間變數i,初始化i=2
int i = 2;
//依次判斷每一個不大於根號n的i是否能被n整除
for(i = 2; i * i = n;i++)
{
//如果能夠整除
if(n % i == 0)
//直接返回0,表示n不是一個素數
return 0;
}
//如果程序運行到這里,說明i*i大於n
//說明n是一個素數
return 1;
}
int main()
{
printf(%d : %dn, 2, is_prime(2));
printf(%d : %dn, 4, is_prime(4));
printf(%d : %dn, 9, is_prime(9));
printf(%d : %dn, 15, is_prime(15));
printf(%d : %dn, 17, is_prime(17));
printf(%d : %dn, 23, is_prime(23));
printf(%d : %dn, 25, is_prime(25));
return 0;
}
工具/材料
ubuntu,vim,gcc
㈢ 求C語言中 判斷素數的 代碼!!!!!
基本思想:把m作為被除數,將2—INT( )作為除數,如果都除不盡,m就是素數,否則就不是。
可用以下程序段實現:
void main()
{ int m,i,k;
printf("please input a number: ");
scanf("%d",&m);
k=sqrt(m);
for(i=2;i<k;i++)
if(m%i==0) break;
if(i>=k)
printf("該數是素數");
else
printf("該數不是素數");
}
將其寫成一函數,若為素數返回1,不是則返回0
int prime( m%)
{int i,k;
k=sqrt(m);
for(i=2;i<k;i++)
if(m%i==0) return 0;
return 1;
}
(3)c語言素數程序擴展閱讀:
篩法求素數
一、基本思想
用篩法求素數的基本思想是:
把從1開始的、某一范圍內的正整數從小到大順序排列, 1不是素數,首先把它篩掉。剩下的數中選擇最小的數是素數,然後去掉它的倍數。依次類推,直到篩子為空時結束。
如有:
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
1不是素數,去掉。剩下的數中2最小,是素數,去掉2的倍數,餘下的數是:
3 5 7 9 11 13 15 17 19 21 23 25 27 29
剩下的數中3最小,是素數,去掉3的倍數,如此下去直到所有的數都被篩完,求出的素數為:
2 3 5 7 11 13 17 19 23 29
二、C++實現
1、演算法一:令A為素數,則A*N(N>1;N為自然數)都不是素數。
#definerange2000
bool
IsPrime[range+1];
/*set函數確定i是否為素數,結果儲存在IsPrime[i]中,此函數在DEV
C++中測試通過*/
voidset(boolIsPrime[])
{
inti,j;
for(i=0;i<=range;++i)
IsPrime[i]=true;
IsPrime[0]=IsPrime[1]=false;
for(i=2;i<=range;++i)
{
if(
IsPrime[i])
{
for(j=2*i;j<=range;j+=i)
IsPrime[j]=false;}}}2、
說明:解決這個問題的訣竅是如何安排刪除的次序,使得每一個非質數都只被刪除一次。 中學時學過一個因式分解定理,他說任何一個非質(合)數都可以分解成質數的連乘積。
例如,16=2^4,18=2 * 3^2,691488=2^5 * 3^2 * 7^4等。如果把因式分解中最小質數寫在最左邊,有16=2^4,18=2*9,691488=2^5 * 21609,;
換句話說,把合數N寫成N=p^k * q,此時q當然是大於p的,因為p是因式分解中最小的質數。由於因式分解的唯一性,任何一個合數N,寫成N=p^k * q;的方式也是唯一的。
由於q>=p的關系,因此在刪除非質數時,如果已知p是質數,可以先刪除p^2,p^3,p^4,... ,再刪除pq,p^2*q,p^3*q,...,(q是比p大而沒有被刪除的數),一直到pq>N為止。
因為每個非質數都只被刪除一次,可想而知,這個程序的速度一定相當快。依據Gries與Misra的文章,線性的時間,也就是與N成正比的時間就足夠了(此時要找出2N的質數)。
代碼如下:
#include<iostream>
#include<cmath>
usingnamespacestd;
intmain()
{
intN;cin>>N;
int*Location=newint[N+1];
for(inti=0;i!=N+1;++i)
Location[i]=i;
Location[1]=0;//篩除部分
intp,q,end;
end=sqrt((double)N)+1;
for(p=2;p!=end;++p)
{
if(Location[p])
{
for(q=p;p*q<=N;++q)
{
for(intk=p*q;k<=N;k*=p)
Location[k]=0;
}
}
}
intm=0;
for(inti=1;i!=N+1;++i)
{
if(Location[i]!=0)
{
cout<<Location[i]<<"";
++m;
}
if(m%10==0)cout<<endl;
}
cout<<endl<<m<<endl;
return0;
}
該代碼在Visual Studio 2010 環境下測試通過。
以上兩種演算法在小數據下速度幾乎相同。