⑴ c語言求素數的演算法
根據素數的性質,代碼設計如下:
設計一:判斷n是否能被1~n-1整除,不能整除為素數
#include<stdio.h>
int main()
{
int i, n;
scanf("%d", &n);
for (i = 2; i < n ; i++)
{
if (n%i == 0)
break;
}
if (i < n) printf("This is not a prime.");
else printf("This is a prime.");
return 0;
}
設計二:判斷n是否能被2~√n間的整數整除,不能整除為素數
#include<stdio.h>
#include<math.h>
int main()
{
int n,i;
double k;
scanf("%d", &n);
k = sqrt(n);
for (i = 2; i <= k;i++)
{
if (n%i == 0) break;
}
if (i <=k) printf("This is not a prime.");
else printf("This is a prime");
return 0;
}
(1)判斷素數的c語言演算法擴展閱讀:
1.素數的定義是只能被1和他本身整除,1不是素數.因此要判斷一個數是否為素數.就要判斷它能不能被比他小的所有素數整除,這是一個演算法.(寫到演算法時,我只能寫出用它除以比他小的所有數,造成運算速度低下)
2.如果一個質數大於根號n,而n可以除盡它,那麼n必然也可以除盡一個更小的質數。由此可以得到一個法2較快的素數判斷演算法
⑵ c語言判斷素數共有幾種方法
判斷是不是素數,素數就是只能被1和本身整除的自然數。
void
main()
{
int
m,i,k;
printf("please
input
a
number:\n");
scanf("%d",&m);
k=sqrt(m);
for(i=2;i<k;i++)
if(m%i==0)
break;
if(i>=k)
printf("該數是素數");
else
printf("該數不是素數");
}
⑶ C語言中怎麼判斷素數
首先分析需求,素數是指 除了1和它本身以外,不能被任何數整除的數。例如:1,3,5,7,11,13.。。。。。。。
例如輸入一個數m,判斷m是否是素數。我們可以用 m向小於m大於1的所有整數求余。如果有一個值是等於0,那麼,就能證明這個數是素數。
m %(2...(m-1)) == 0。
當然,更好的演算法是 m 向 (小於或等於 m的中位數) (大於1) 的所以數求余。
m%(2...(m/2)) == 0
如果你只想求實際代碼,當我沒說過。因為我這只是提供一個思路。
⑷ 編寫一個C語言程序判斷一個數是否是素數
目的:判斷一個數是否為素數
#include<stdio.h>
intmain(void)
{
int m;
inti;
scanf("%d",&m);
for(i=2;i< m;i++) //2到(m-1)的數去除m
{
if(m%i==0)//判斷能否整除
break;
}
if(i== m)
printf("YES!
");
else
printf("No!
");
}
for循環的功能:
①若能整除,通過break跳出函數;
②若一直到m-1都不能整除,此時i再自增1到m,不滿足i< m跳出for循環,這時i= m。
(4)判斷素數的c語言演算法擴展閱讀:
素數定理:
1、在一個大於1的數a和它的2倍之間(即區間(a,2a]中)必存在至少一個素數。
2、存在任意長度的素數等差數列。
3、一個偶數可以寫成兩個合數之和,其中每一個合數都最多隻有9個質因數。(挪威數學家布朗,1920年)。
4、一個偶數必定可以寫成一個質數加上一個合成數,其中合數的因子個數有上界。(瑞尼,1948年)。
5、一個偶數必定可以寫成一個質數加上一個最多由5個因子所組成的合成數。後來,有人簡稱這結果為(1+5)(中國潘承洞,1968年)。
6、一個充分大偶數必定可以寫成一個素數加上一個最多由2個質因子所組成的合成數。簡稱為(1+2)。
⑸ C語言判斷素數
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
using namespace std;
int prime(int x){
for(int i=2;i<x;i++){
if(x%i==0)
return 0;
}
return 1;
}
int main(){
int a=0; // 素數的個數
int num[9]; // 輸入的整數
int numl[9]={0};
printf("輸入10個整數:\n");
cfu:
//有個小BUG需要輸入11個數,最後一個不算入計算之內。
for(int i = 0;i < 10;i++){
scanf("%d\n",&num[i]);
}
for (int i = 0;i < 10;i++)
{
if (num[i] >= 50 && num[i] <= 2000)
{
//判斷是不是素數;
if(prime(num[i])==1){
printf("%d 不是素數\n",num[i]);
}
else{
printf("%d 是素數\n",num[i]);
numl[a++] = num[i];
}
}else{
printf("請輸入50到2000之間的數\n");
goto cfu;
}
}
//排序寫在這里就可以了。
int lenth = a;
cout << "長度為: "<< lenth << endl;
for (int i = 0;i < lenth-1;i++)
{
for (int j = 0;j < lenth-1-i;j++)
{
if (numl[j] < numl[j+1] )
{
int temps = numl[j];
numl[j] = numl[j+1];
numl[j+1] = temps;
}
}
}
for (int i=0;i<lenth;i++)
{
printf("%d ",numl[i]);
}
while(1);
return 0;
}
//好像看錯題了,我的是輸入10個數判斷是否是素數,,,,,
//這個重新寫了一個,就符合題的意思了,你想輸出其他的素數就自己加條件,當成拓展就可以了.
#include "stdafx.h"
#include <iostream>
using namespace std;
int prime(int x){
for(int i= 2;i< x ; i++){
if(x%i == 0)
return 0;
}
return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
int m,k=0;
int arr[2000]={0};
printf("輸入50到2000之間的整數: ");
cfu:
scanf("%d",&m);
if (m >= 50 && m <= 2000)
{
//判斷在m以內有素數
for (int i =2;i < m; i++)
{
if (prime(i)==1){
printf("%d 是素數\n",i);
arr[k++]= i;
if (k == 10)
{
break;
}
}else{
printf("%d 不是素數\n",i);
}
}
}else{
printf("輸入50到2000之間的整數");
goto cfu;
}
cout << "K的值: "<< k << endl;
for (int i = 0;i < k-1;i++)
{
for (int j = 0;j < k-1-i;j++)
{
if (arr[j] < arr[j+1] )
{
int temps = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temps;
}
}
}
printf("10個數排序:");
for (int i = 0;i< k; i++)
{
printf("%d ",arr[i]);
}
while(1);
return 0;
}
⑹ 如何編寫一個C語言程序判斷一個數是否是素數
思路1:
判斷一個整數m是否是素數,只需把m被 2 ~ m-1 之間的每一個整數去除,如果都不能被整除,那麼m就是一個素數。代碼如下:
#include <stdio.h>
int main(){
int a=0; // 素數的個數
int num=0; // 輸入的整數
printf("輸入一個整數:");
scanf("%d",&num);
for(int i=2;i<num;i++){
if(num%i==0){
a++; // 素數個數加1
}
}
if(a==0){
printf("%d是素數。
", num);
}else{
printf("%d不是素數。
", num);
}
return 0;
}
思路2:
另外判斷方法還可以簡化。m不必被 2 ~ m-1 之間的每一個整數去除,只需被 2 ~ 之間的每一個整數去除就可以了。如果m不能被 2 ~ 間任一整數整除,m必定是素數。例如判別17是是否為素數,只需使17被2~4之間的每一個整數去除,由於都不能整除,可以判定17是素數。代碼如下:
#include <stdio.h>
#include <math.h>
void main(){
int m; // 輸入的整數
int i; // 循環次數
int k; // m 的平方根
printf("輸入一個整數:");
scanf("%d",&m);
// 求平方根,注意sqrt()的參數為 double 類型,這里要強制轉換m的類型
k=(int)sqrt( (double)m );
for(i=2;i<=k;i++)
if(m%i==0)
break;
// 如果完成所有循環,那麼m為素數
// 注意最後一次循環,會執行i++,此時 i=k+1,所以有i>k
if(i>k)
printf("%d是素數。
",m);
else
printf("%d不是素數。
",m);
return 0;
}
⑺ 求"求素數的C語言程序"
#include <stdio.h>
int main()
{
int a=0;
int num=0;
int i;
printf("輸入一個整數:");
scanf("%d",&num);
for(i=2;i<num;i++){
if(num%i==0){
a++;
}
}
if(a==0){
printf("%d是素數。 ", num);
}else{
printf("%d不是素數。 ", num);
}
return 0;
}
(7)判斷素數的c語言演算法擴展閱讀:
質數又稱素數。一個大於1的自然數,除了1和它自身外,不能被其他自然數整除的數叫做質數;否則稱為合數。
基本演算法:若 k%m==0 則說明 k 不是素數。
判斷整數n是否為素數——採用枚舉法求解。
採用枚舉演算法解題的基本思路:
(1)確定枚舉對象、枚舉范圍和判定條件;
(2)枚舉可能的解,驗證是否是問題的解。
枚舉演算法的一般結構:while循環。
參考資料來源:網路-枚舉法
⑻ c語言如何判斷素數
素數又稱質數,所謂素數是指除了 1 和它本身以外,不能被任何整數整除的數,例如17就是素數,因為它不能被 2~16 的任一整數整除。判斷一個整數m是否是素數,只需把 m 被 2 ~ m-1 之間的每一個整數去除,如果都不能被整除,那麼 m 就是一個素數。
首先要知道素數是不等於1,它的因子只有1和它本身。判斷一個數是否為素數,可以用大於1小於給定數的所有數去除給定數,如果有任何一個能夠除盡,就表示是合數,反之是素數。
(8)判斷素數的c語言演算法擴展閱讀:
首先,本文英文字母都表示整數,上半部B 》3N 》W,下半部B 》W 》3N。大於3的素數只有6N-1和6N+1兩種形式,我們只需判定這兩種數是素數還是合數即可。
命題 1 對於B=36N+1 形數而言。
若不定方程(3N)^2+N-(B-1)/36=W^2 有整數解,
則 6(3N-W)+1 是小因子數;6(3N+W)+1 是大因子數。
若不定方程 (3N)^2-N-(B-1)/36=W^2 有整數解,
則 6(3N-W)-1 是小因子數;6(3N+W)-1 是大因子數。
兩式都無解,是素數。
⑼ 求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;
}
(9)判斷素數的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 環境下測試通過。
以上兩種演算法在小數據下速度幾乎相同。