我認為問題出在for-loop上,但我無法理解。這是學校的一項作業,我只應該用for-loop和if陳述句來解決!
#include <stdio.h>
int is_prime(int n){
for (int i=2; i<n; i ){
if (n%i! =0){
return 1。
}
else{
return 0;
};
};
}
int main(void){
printf("%d
", is_prime(11)); //11是一個素數。 應該列印1.
printf("%d
", is_prime(383)); // 383是一個質數。 應該列印1.
printf("%d
", is_prime(987)); // 987不是質數。應該列印0.
}
uj5u.com熱心網友回復:
對于初學者來說,if陳述句后的null陳述句和for回圈本身
。 for (int i=2;i<n; i ){
if (n%i! =0){
return 1。
}
else{
return 0;
};
^^^
};
^^^
是多余的。
由于if陳述句的存在,只要n % i不等于0或等于0,for回圈就會中斷。因此,一般來說,該函式的行為并不取決于所傳遞的數字是質數還是非質數。
如果你要移動回傳陳述句的話
return 1。
在回圈之外,正如其他人建議的那樣,該函式仍然是不正確的。它將顯示0和1是素數,而它們不是。
此外,回圈的條件使回圈的效率低下,至少是因為在進入回圈之前,很明顯除了2之外的任何偶數都不是質數。
請注意,函式引數應該是無符號整數型別。
該函式可以用以下方式定義
int is_prime( unsigned) type">unsigned long long int n )
{
int prime = n % 2 == 0 ? n == 2 : n !=1;
for ( unsigned long long int i =3; 素數 && i <= n / i; i = 2 )
{
prime = n % i != 0;
}
return prime。
}
int main(void)
{
printf( "%d
", is_prime( 11 )。
printf( "%d
", is_prime( 383 ) ) 。
printf( "%d
", is_prime( 987 ) ) 。
return 0。
程式輸出是
1
1
0
uj5u.com熱心網友回復:
問題在于回傳1 在回圈內。當你找到一個 i不是n的因子時,你假設n是質數。但你必須確保所有 i都不是質數的因子,所以return 1必須放在回圈之后。然而,這將導致數字<2被認為是素數,因為它們根本就沒有進入回圈。因此,你還必須在開頭添加一個額外的if。
順便說一下。每個n的除數(期望n本身)必須是<=sqrt(n),因此你可以大大加快你的函式。
#include <math.h>
int is_prime(int n) {
if (n < 2)
return 0;
int max_divisor = sqrt(n)。
for (int i = 2; i <= max_divisor; i ) {
if (n % i == 0)
return 0;
}
return 1;
uj5u.com熱心網友回復:
問題:回傳陳述句
return 1;
}
else{
return 0;
它導致回圈在那時退出。在你的案例中也是如此,它在實作第一個'1'的時候就退出了。
解決方案。
解決方案。相反,你應該嘗試將值存盤在一個變數中,并在回圈結束時與'1'或'0'進行比較
。轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/328916.html
標籤:
