A. c語言 完美的素數 求解
#include<stdio.h>
intisprime(intn)
{
inti;
for(i=2;i<n;i++)
if(n%i==0)
break;
if(i==n)
return1;
else
return0;
}
intmain(void)
{
intn,t;
ints=0;
scanf("%d",&n);
t=n;
while(t!=0)
{
s=s+t%10;
t=t/10;
}
if(isprime(s)&&isprime(n))
printf("%d是完美素數 ",n);
else
printf("%d不是完美素數 ",n);
return0;
}
B. c語言中如何求素數
思路:所謂素數是指只能被1和自身整除的數叫作素數,判斷素數就可以從2到該數減一依次判斷能否整除該數,如果能則不是素數,否則就是素數。
參考代碼:
#include<stdio.h>
intisp(intn)//判斷是否是素數,是返回1,否則返回0
{
inti;
for(i=2;i<n;i++)
if(n%i==0)return0;
return1;
}
intmain()
{
inta;
scanf("%d",&a);
if(isp(a))
printf("%d是素數 ",a);
else
printf("%d不是素數 ",a);
return0;
}
/*
輸出:
89
89是素數
*/
C. c語言編程,求素數的問題
他這樣是篩素數
a[i]最初等於2
他把能被2整除的都記為0了
那在以後的運算中
保證a[i]是素數
也就是除一個素數
a[j]等於0
說明他已經被一個素數整除了
已經不是素數了
所以就不用再計算他了
也就是
先篩掉2的倍數
再篩掉3的倍數
再篩掉5的倍數(4被2整除
已經記為0)
再篩掉7的倍數(6被2整除
已經記為0)
再篩掉11的倍數
(8被2整除
9被3整除
10被2整除
都已經被記為0)
。。。。。
最後剩下的就都是素數了
樓主主要注意一下i和j的循環
j的循環是在i的循環裡面的,而且他們同是代表數組a的下標
那麼當i=2時,是進入j的循環,此時是要將j的循環跑完之後才再進行i++
那麼a[j]已經記為0的數,也就是j,i的循環肯定是之後才會循環到
再說明白點,當i=2時,你把j=4的a[j]=0,那麼此時的i是2,之後i會自加到4
那麼a[i]就是0
如果樓主想不明白
可以把i和j的循環打出來看一下,就像這樣
for(i=2;i<sqrt(N);i++)
for(j=i+1;j<N;j++)
{
printf("i=%d
j=%d\n",i,j);
if(a[i]!=0&&a[j]!=0)
if(a[j]%a[i]==0)
a[j]=0;
}
D. C語言編程 求素數 求解釋
#include
#include
#include
void
main()
{
int
m,i,k;
scanf("%d",&m);
k=sqrt(m);
//一個數不是素數,那麼開平方也一定不是素數。
//將一個數開平方再取整,可以減少比較次數,提高運行效率。
for(i=2;i<=k;i++)//一個一個比較看這個數能不能除盡小於它的所有數
if(m%i==0)
//如果可以除盡這個數,那麼就跳出循環
break;
if(i>=k+1)
//如果i>=k+1
說明一直循環到最後了,中間沒有可以除盡的數,這個數就是素數
printf("%d
is
a
prime
number\n",m);
else
//相反就不是素數
printf("%d
is
not
a
prime
number\n",m);
system("pause");
}
E. 求"求素數的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;
}
(5)素數求解c語言程序擴展閱讀:
質數又稱素數。一個大於1的自然數,除了1和它自身外,不能被其他自然數整除的數叫做質數;否則稱為合數。
基本演算法:若 k%m==0 則說明 k 不是素數。
判斷整數n是否為素數——採用枚舉法求解。
採用枚舉演算法解題的基本思路:
(1)確定枚舉對象、枚舉范圍和判定條件;
(2)枚舉可能的解,驗證是否是問題的解。
枚舉演算法的一般結構:while循環。
參考資料來源:網路-枚舉法
F. 求素數的c語言程序
// 素數,也叫質數,就是指除了1和該數本身以外,不能被其他任何整數整除的正數#include<stdio.h>#include<math.h>void main(){ int m, k, i, n=0; for(m=1; m <= 200; m=m+2) { k = sqrt(m); for(i=2; i <= k; i++) if(m % i == 0) break; if(i >= k + 1) { printf("%5d",m); n = n + 1; } }}請放心使用,有問題的話請追問
滿意請及時採納,謝謝,採納後你將獲得5財富值。
你的採納將是我繼續努力幫助他人的最強動力!
G. C語言程序設計求素數
在程序的開頭加入#include<math.h>
下面是fun函數:
int fun(int mm,int b[MAX])
{
int i,mmm,n=0;
for(mmm=2;mmm<=mm;mmm++)
{
for(i=2;i<=sqrt(mmm);i++)
if(mmm%i==0) break;
if(i>sqrt(mmm))
{
b[n]=mmm;
n+=1;
}
}
return n;
}
分析:
如果mm<=1,外循環不啟動,直接返回n,此時n=0
如果mm=2,外循環啟動,內循環i<=sqrt(mmm)的條件不滿足,不啟動,內循環下面的判斷條件滿足,於是讓b[n]=mmm,n+=1,即找到一個符合條件的素數,此時b[n]既b[0]=2,然後n+=1,表示符合條件的素數的個數加1
同樣,當mm=3的時候,內循環由於條件不滿足,是不會執行的,但是在內循環下面的條件判斷都滿足,所以會把結果保存在n和b[n]裡面,這時,外循環要執行2次
當mm>3時,內循環也會啟動,但是要等內循環結束之後i的值滿足條件的才是素數,程序的可靠信完全可以放心
剛剛又重新分析了一遍代碼,稍微改了改,沒問題了
H. 求判斷素數的C語言程序
C語言-尋找素數
附代碼:
#include<stdio.h>
#include<math.h>
int main()//原理:設ab=c,a<b,則有a<根號c<b。若設a恆小於根號c,則只需判斷a是否為因數
{
int a, b;
printf("請按從小到大輸入兩個素數:");
scanf_s("%d %d", &a, &b);
int n = 0,m=0,sum = 0;
double i, j;//i是從a到b的待篩選數,j是從2到根號i的除數,要判斷j是否為i的因數
for (i = a; i <= b; i++)
{
m = 0;
int c = int(pow(i, 0.5));
for (j = 2; j <= c; j++)
{
if ((i / j - int(i / j)) == 0.0)
{
m++;//m是i被從2到根號i的j除了之後,商為整數,即發現j是i的因數的次數
}
}
if (m==0)
{
printf("找到素數:%d
", int(i));
n++;
sum = sum + i;
}
}
printf("大於等於%d,小於等於%d的素數的個數為:%d
", a, b, n);
printf("它們的和為:%d", sum);
return 0;
}
I. 求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 環境下測試通過。
以上兩種演算法在小數據下速度幾乎相同。
J. 用C語言寫出求素數的編程
參考代碼:
int main(){
int num,m,n,d,c,priSum;
printf("Enter the Range Between m,n ");
scanf("%d %d", &m,&n);
for (num = n; num <= m; num++)
{
for(d = 2; d < num; d++)
{
if (num % d == 0){
continue;
}
}
if (d == num){
priSum += d;
c++;
}
}
printf("m~n之間的素數個數:%d,和 %d ",c,priSum);
return 0;
}