該代碼即將找到素數和僅由素陣列成的素數。我的同學說要除以 10,但我不太明白。
#include <stdio.h>
#include <stdlib.h>
int main()
{
setvbuf(stdout, NULL, _IONBF, 0);
int N, i, j, isPrime, count = 0, count2=0;
printf("Please input the value of N: \n");
scanf("%d", &N);
for (i = 2; i <= N; i )
{
isPrime = 0;
for (j = 2; j <= i / 2; j ) // it starts from 2
{
if ((i % j) == 0)
{
isPrime = 1;
break;
}
}
if (isPrime == 0)
{
printf("%d\n", i);
count ;
if (i%2 !=0) //to check the odd number
{
count2 ;
}
}
}
printf("The number of primes is:%d \n", count);
printf("The number of odd primes is:%d \n", count2);
}
uj5u.com熱心網友回復:
如果您將不同的功能劃分為不同的功能,那么考慮這樣的代碼總是更容易。從理論上講,您可以將所有代碼交織在一起,讓代碼同時檢查素數和奇數,但撰寫、閱讀、理解和除錯要困難得多,所以除非有一些令人信服的理由來壓縮所有內容(例如,也許是效率),對于日常目的,將事物分開要容易得多。
因此,盡管您還沒有完全那樣撰寫代碼,但我想象的是我們有一個n我們有興趣檢查的數字。在您的情況下,它是回圈中的回圈變數for(i = 2; i <= N; i )。如果你只是數素數,你會有
if(isprime(n))
count ;
在這里,我想象你有一個單獨的函式isprime(),你可以呼叫它來查看一個數字是否是素數。(它將包含您當前用于將isPrime變數設定為 true 或 false 的相同型別的代碼。)然后,如果您想計算有多少素數只有奇數,您可能會這樣做:
if(isprime(n)) {
count ;
if(has_only_odd_digits(n))
count2 ;
}
以這種方式排列,count將計算有多少個素數,以及count2有多少個素數并且只有奇數位。(不同的安排顯然可以回答這個問題的不同變體,比如有多少數字只有奇數,無論它們是否是素數。)
然后顯而易見的問題是:假設has_only_odd_digits函式從何而來?當然,我們必須自己撰寫它,但好在我們撰寫它時,我們只需要考慮確定數字是偶數還是奇數的問題;我們根本不必擔心素數。
因此,讓我們先開始寫作has_only_odd_digits。您最初發布的代碼中有一個版本:
int has_only_odd_digits(int n)
{
if(n % 2 == 0) /* if even */
return 0;
else return 1;
}
但這是錯誤的:它只是測驗數字n本身是偶數還是奇數。它會為 2 和 20 和 222 回傳“false”,它會為 3 和 13 以及 13579 回傳“true”,但它也會為 2461 回傳“true”,因為 2461 是奇數,即使它恰好有大部分甚至數字。因此,對于一個作業版本,has_only_odd_digits我們需要更像這樣的東西:
int has_only_odd_digits(int n)
{
for(each digit d of n) {
if(d % 2 == 0)
return 0;
}
return 1;
}
這是偽代碼,還不是真正的 C 代碼。請注意,這次宣告else中沒有if。如果我們找到一個偶數,我們就完成了。但是如果我們找到一個奇數,我們還不一定回傳“真”——我們必須檢查所有的數字,只有當沒有一個數字是偶數時才回傳“真”。
但真正的問題是,我們如何獲得這些數字?int變數在內部沒有任何遠程表示,例如十進制數字陣列。不,一個int變數是一個整數,一個數字,而獲得其十進制數字表示的唯一方法是,從字面上看,將它反復除以 10。
所以,稍微充實我們的代碼,我們就會有類似的東西
int has_only_odd_digits(int n)
{
while(n != 0) {
int d = one digit of n;
if(d % 2 == 0)
return 0;
n = the rest of n, except for the digit d we just checked;
}
return 1;
}
這就是我要接受的:我認為你現在已經有了這個想法,如果這是一個家庭作業,我不會為你做所有的作業。:-) 我會注意到,您的問題標題和問題中的問題描述之間仍然存在差異:您是在尋找奇數的質數還是質數?(如果是后者,老實說,我不確定如何處理 1,但這將是你和你的導師的問題,我猜。)
但是,最后,我想指出兩點:除了學習如何計算奇數素數之外,我希望你也開始理解兩個更普遍的相關點:
如果您將一個復雜的程式分解為單獨的函式,那么孤立地考慮每個函式(問題的每個部分)會容易得多。
如果您不確定如何做某事,通常您可以分小步進行攻擊,這是一種“逐次改進”的方法,就像我在
has_only_odd_digits此處對函式的幾個不同版本所做的那樣。
現在,確實,你不一定能以任何舊的方式將一個復雜的問題分解為函式,當你通過逐步細化來解決問題時,你必須選擇正確的步驟。但是,這些絕對是有價值的方法,并且隨著時間和經驗的積累,您會發現如何將一個大問題分解成您可以處理的部分變得越來越容易。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/507334.html
