1. 程式人生 > >數論(各種數)

數論(各種數)

本文收集了一些常用的基礎的數的簡單講解,包括:最大公約數與最小公倍數素數水仙花數完數迴文數
最大公約數與最小公倍數之前已經出過,點選連結即可訪問。

二、素數

(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. 一個數的約數的範圍為 1 < a < 根號n,利用這點,便可以壓縮尋找的範圍;
  2. 此函式的作用是判斷一個數是否為素數,若是則返回 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 << " ";
		}
	}
}

注意:

  1. sum記得在使用前要賦初始值,且sum賦初值的位置必須在內層迴圈前;
  2. m 用來代替 原始數字 來完成逆序轉換,如果不這樣做,在完成逆序轉換後原始數字將會變成0,無法進行比較。