我試著計算有多少個素數(除了 1 和 0),直到有 N 個素數。但不知何故,我的程式總是無限回圈
int main (){
int n;
printf("Enter size N: ");
scanf("%d", &n);
int i, j, ctr = 0, flag = 0;
for (i = 2; ctr != n; i ){
for (j = 2; j < i; j ){
if (i%j==0){
flag = 1;
break;
}
}
if(flag!=1){
ctr ;
}
}
}
uj5u.com熱心網友回復:
我注意到你從來沒有重置你的標志。因此,一旦找到分隔線,您就舉起旗幟以表明它不是素數。但永遠不要將其設定回 0,因此之后的所有數字都會被考慮not prime
int i, j;
int ctr = 0; // Prime number counter
int flag;
// For i, from 2 to whatever needed to have N prime numbers
for (i = 2; ctr != n; i ){
flag = 0 // THIS IS THE LINE YOU'RE MISSING
// Look for potential divider
for (j = 2; j < i; j ){
// If i is divided by j, it isn't prime
if (i%j==0){
flag = 1;
break;
}
}
// If no divider found, i is prime
if(flag!=1){
ctr ;
}
}
uj5u.com熱心網友回復:
要向您的程式添加與 Portevent 提到的不同的內容,您不必檢查是否i % j != 0所有人都 j < i檢查是否i是素數。你只需要檢查 range j < sqrt(i)。
這是因為當你得到一個j這樣的值時你會停止回圈i % j == 0。如果你得到j == sqrt(i)它意味著i不是素數,它至少會有一個p * q與p和q大于的素數分解sqrt(i),這是無稽之談,因此i 是素數。
PS:如果您將此優化添加到程式中,請不要sqrt(i)在 for 回圈中硬編碼,將其分配給某個變數然后將變數寫入回圈中以避免重復計算。
uj5u.com熱心網友回復:
誰告訴你你的程式無限回圈的?它沒有。您只是錯過了像其他人指定的那樣重置標志。并且:
你可以回圈 j < i/2;
想一想:除了self之外,素數/非素數的最大整數除數是多少?
要找出它,除以可能的最小整數:
如果我們將它除以 1,我們會得到數字本身 *
如果我們將它除以 2,我們得到數字的一半,這是可能的最大除數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/518351.html
標籤:C
