求質數c語言
A. c語言求100以內的質數
以我來看我覺得兩個for循環都有問題。
首先第一個for循環應該錯了。應該是i < 100。因為是求100以內的,所以要循環到100。
這個程序就是利用for循環讓i從2遍歷到99.然後利用j找出了1和本身之外i的因數。
那麼第二個for循環問題就來了,我們尋找i的因數的時候,並不需要從2一直找到i本身,只要找到i的一半就可以停止了。舉個簡單例子,比如我們要找98的因數,那麼我們只需要找到98÷2 = 49就行了,因為49之後的數字是肯定不能整除98的。同理大於i/2之後的數字是肯定不能夠整除i的。所以第二個for的條件應該是j <= (i/2)而不是j。下面就簡單了。如果j是i的因數,那麼i%j=0. 就直接continue(順便提一句這里是不能用break的,因為break是直接跳出了for循環,相當於直接結束了整個for循環,而此時還沒有遍歷到100的,應該用continue,continue就是結束當前循環並且執行i++繼續下一輪循環)繼續循環而不用執行print語句(這個時候代表i不是質數,因為除了1和它本身還有j這個因數。)。同理,如果從2到i/2都沒有i的因數,那麼就說明i沒有其他因數,也就是質數了,所以print輸出i。
另外補充一下:
i/j是求i除以j的商,比如11 / 3 = 3; 6 / 3 = 2
i%j是求i除以j的余,比如11 % 3 = 2; 6 % 3 = 0。
B. C語言求質數問題
#include<stdio.h>
#include<math.h>
intmain()
{
intm,n,c=0,i,t,j;
scanf("%d%d",&m,&n);
if(m==0&&n==0)//<===========
{
return0;
}
elseif(m>n)
{
t=m,m=n,n=t;
}
//else
for(i=m;i<=n;i++)
{
for(j=2;j*j<=i;j++)//<============
{
if(i%j==0)
break;
}
if(j*j>i)//<==========
{
printf("%d",i);
c++;
if(c==10)
{
printf(" ");
c=0;
}
}
}
return0;
}
C. 求素數的C語言程序!
素數,也叫質數,就是指除了1和該數本身以外,不能被其他任何整數整除的正數。
#include<stdio.h>#include<math.h>voidmain(){intm,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;D. 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;
}
(4)求質數c語言擴展閱讀:
1.素數的定義是只能被1和他本身整除,1不是素數.因此要判斷一個數是否為素數.就要判斷它能不能被比他小的所有素數整除,這是一個演算法.(寫到演算法時,我只能寫出用它除以比他小的所有數,造成運算速度低下)
2.如果一個質數大於根號n,而n可以除盡它,那麼n必然也可以除盡一個更小的質數。由此可以得到一個法2較快的素數判斷演算法
E. C語言求質數
紅框里的代碼,加上那個i++的for循環,其邏輯是:
從2開始,遍歷所有小於n的整數,
只要存在一個整內數可容以被n整除(即余數為0),則可判斷n為合數.
若從2到n-1范圍內,不存在可整除n的數,則判斷n為質數.
還有 for(int .......)這種定義變數的寫法,要C99才支持,現在很多編譯器默認C89標准,或者不支持C99標准,這樣寫容易出錯.
第一個for循環裡面,直接把n=0,1,2的情況跳過了.既然這樣,變數n直接把初值賦為3不就好了,賦值0幹嘛.
第二個for循環裡面,判斷到i<sqrt(n)就可以了,還有更簡單的求質數演算法,感興趣可以網路.
F. c語言求質數
有救!有救!
你的思路挺好的,就是編程的時候思路不清晰,沒有周全考慮。
這是改後的代碼
#include
"stdio.h"
#include
"conio.h"
main()
{
int
m,n,i,num;
int
p[100];
long
s;
s=2;
m=1;
n=1;
num=1;
p[1]=2
;
for
(;num<100;num++)/*這里的分號應該是你筆誤吧O(∩_∩)O*/
{for
(i=1,n=2;;)
/*這里n=2而非m估計也是你筆誤?*/
{m=p[i]
;
if
(m>s/2)
break;
else
if(m*n<s)
n++;
else
if(m*n==s)
{s++;i=1;n=2;}/*這里*/
else
if(m*n>s)
{i++;n=2;}/*和這里,仔細想一想,當嘗試一個新的數字或嘗試一個新的質數時,是不是要把計數變數初始化?*/
/*編程的時候不要想當然,要通盤考慮,每個變數是否都做了妥善的處理*/
}
p[num]=s;/*你要用質數表,怎麼能不記錄質數表呢^o^*/
printf
("p%d=%ld\n",num,s);
s++;
}
getch();
}
你的程序運用質數表這點很好,但是你的程序還沒發揮到最高效率。里邊有一些無用的判斷和賦值,而且沒有利用mod運算,使程序既復雜又低效。
我覺得還是用標準的求質數演算法比較好,到處都有,不再說了。
G. 用C語言編寫求質數的程序
//我分別寫出了求素數和判斷素數的程序
/*
//判斷一個數是否為素數
#include<stdio.h>
#include<math.h>
int isprime(int);
void main()
{
int inumber;
printf("請輸入一個非負整數: ");
scanf("%d",&inumber);
if(isprime(inumber))
printf("%d是素數!\n",inumber);
else
printf("%d不是素數!\n",inumber);
}
int isprime(int a)
{
int i;
for(i=2;i<=sqrt(a);i++)
if(a%i==0)
return 0;
return 1;
}
*/
/*****************************************************/
//求某個正整數以內的素數
#include"stdio.h"
#include"math.h"
int main(void)
{
int count,i,m,n,num;
printf("請輸入所求范圍(正整數): ");
scanf("%d",&num);
count=0;//count記錄素數的個數
printf("%d以內的素數為:\n",num);
for(m=2;m<=num;m++)
{
n=sqrt(m);
for(i=2;i<=n;i++)
{
if(m%i==0)
break;
}
if(i>n)//如果m是素數
{
printf("%6d",m);
count++;
if(count%10==0)//count為10的倍數時換行
printf("\n");
}
}
printf("\n");
return 0;
}
H. C語言求素數代碼
請你把if(r=0)
改為r==0
I. c語言中如何求素數
樓上的還可以具體一些,其實非常簡單,如果一個數是素數,只要判斷他是版否能被2到這個數的開方之間的數權整除就行了。
int flag=0;
if(m==2){ //先判斷是不是2
flag=1;
}
else{
for(int i=2;i<=sqrt(m);i++){
flag=1;
if(m%i==0){ //不是素數
flag=0;
break;
}
}
}
return (flag==1)?m:-1; //判斷是否為1,為1輸出m,否則輸出-1 ,-1表示不是素數
如果是求某個范圍的素數,可以連續調用這個方法,上面是常規的方法,還有更好的方法自己去查一下。