數論(各種數)
一
本文收集了一些常用的基礎的數的簡單講解,包括:最大公約數與最小公倍數、素數、水仙花數、完數與迴文數。
最大公約數與最小公倍數之前已經出過,點選連結即可訪問。
二、素數
(1)什麼叫素數?
素數又稱質數(prime number),有無限個。
質數定義為在大於1的自然數中,除了1和它本身以外不再有其他因數。
注意:定義中素數的範圍為大於1的自然數,因此1不是素數。
(2)關於求法?
根據素數的概念(除了1和它本身以外不再有其他因數),使用窮舉的方法即可解決。
(3)程式碼示例
以下程式碼可以參考:
int isPrime(int a) { for (int i = 2; i < (int)(sqrt(a)); i++) { if (a % i == 0) { return 0; } } return 1; }
注意:
- 一個數的約數的範圍為 1 < a < 根號n,利用這點,便可以壓縮尋找的範圍;
- 此函式的作用是判斷一個數是否為素數,若是則返回 1 ,否則返回 0 .
利用以上程式碼便可以列印1 ~ 1000內的素數:
#include <iostream> #include <iomanip> using namespace std; int isPrime(int); int main() { cout << right; //右對齊 int count = 0; //用於計數 for (int i = 2; i < 1000; i++) { if (isPrime(i)) { count++; cout << setw(6) << i; if (count % 5 == 0) { cout << endl; } } } cout << endl << "共計:" << count << "個" << endl; } int isPrime(int a) { for (int i = 2; i < (int)(sqrt(a)); i++) { if (a%i == 0) { return 0; } } return 1; }
以下為執行結果,共計186個:
三、水仙花數
(1)什麼叫水仙花數?
水仙花數是指一個 n 位數(n≥3 ),它的每個位上的數字的 n 次冪之和等於它本身(例如:1^3 + 5^3+ 3^3 = 153)。
水仙花數只是自冪數的一種,嚴格來說3位數的3次冪數才稱為水仙花數。
(2)關於求法
求法同上,暴力窮舉。
(3)程式碼示例
void Nar() { int sum,m,i; for (i = 100; i <= 1000; i++) { m = i; sum = 0; while (m) //將數字逐位分解,並按水仙花概念相加 { sum += pow((double)(m % 10),3); m /= 10; } if (sum == i) { cout << i << '\t'; } } }
注意:
-
pow函式原型:double pow (double _X , double _Y)
-
第一個引數為底數,第二個引數為指數
-
標頭檔案:< cmath >
所以 pow((double)(m % 10),3) 中才需要將第一個引數轉換,在這裡將第二個引數轉換也是可以的: pow( m % 10 ,3.0).
四、完數
(1)什麼叫完數
完數,即完美數,一個數如果恰好等於除它本身外的因子之和,這個數就稱為完數。例如6=1+2+3.(6的因子是1,2,3)
(2)方法
只需找出數字的各個因子,相加後判斷是否與原來的數相等即可。
(3)程式碼示例
int perfect(int a)
{
int i, sum = 0;
for (i = 1; i < a; i++)
{
if (a / i * i == a)
{
sum += i;
}
}
if (sum == a)
{
return 1;
}
return 0;
}
五、迴文數
(1)迴文數
迴文數(或迴文數)是指一個像14641這樣“對稱”的數,即:將這個數的數字按相反的順序重新排列後,所得到的數和原來的數一樣。
(2)做法
將這個數逆序後的數與逆序前的數作比較,即核心部分是將數字逆序。
(3)程式碼示例
下列程式碼的作用是找出一定範圍內的迴文數
void symm(int a, int b)
{
int i,m,sum;
for (i = a; i <= b; i++)
{
m = i;
sum = 0;
while (m) //核心演算法
{
sum = sum * 10 + m % 10;
m /= 10;
}
if (sum == i)
{
cout << i << " ";
}
}
}
注意:
- sum記得在使用前要賦初始值,且sum賦初值的位置必須在內層迴圈前;
- m 用來代替 原始數字 來完成逆序轉換,如果不這樣做,在完成逆序轉換後原始數字將會變成0,無法進行比較。