C++筆記(0)——判定一個數字是否是素數


博主之前使用的編程語言是Python,但是這門語言的效率比較低(通常,不優化的情況下,但是即便如此我還是偏愛Python),而且博主打算參加PAT考試(真正的原因),及博主打算順便深入學習下機器學習框架(如PyTorch)和CUDA,所以必須要學C++。所以,開始吧。

我不打算直接從語法入手,這樣太浪費時間了。因為我已經有了C和Python的基礎,所以我覺得,直接上項目練手,遇到不懂的東西再去翻看相關書籍或觀看相關視頻會快很多。我的目的很明確,就是將PTA刷到xxx分(依據某TED演講中“如果你想要達到某個目標那么就不要將這個目標說出去不然你會在別人的贊賞中以為自己已經達成目標而不努力並開始犒勞自己”效應,這里做馬賽克處理)。因此,這里的筆記都是關於我平時刷分時遇到感覺“哇,這個功能真的好有用如果早知道了的話應該會很幸福吧”情況時的相關知識點。

其實我是第一次使用Dev-C++,但是由於以前碰過Common::Blocks之類的IDE(Visual Studio就懶得提了,爛大街),所以上手起來沒什么問題,就懶得記錄太多沒必要的東西了(例如如何使用)。但是要提一下的就是要記得設置一下編譯器。

以上就是設置編譯器支持C++11標准的步驟。下面進入正題。

判斷一個數字是否是素數

#include <cstdio>
#include <cmath>
using namespace std;

bool isPrime(int n){
	if (n<=1) return false;
	int sqr = int(sqrt(1.0 * n));
	for(int i=2; i<=sqr; ++i){
		if(n % i == 0) return false;
	}
	return true;
}

其實一開始那三行我原本打算省略掉的,但是這里還是加上去比較好,之后的內容都默認已經引入了這些庫和在std的namespace下。

直接談談函數的原理吧,其實很簡單,背后的數學原理就不談了(畢竟比較簡單)。這里的函數的工作就是:

  1. 判斷是不是小於1,如果是那么肯定不是素數,所以返回false
  2. 先將輸入的數字n轉換成浮點數,然后再進行開方處理,得到數字sqr
  3. 接下來就是從2開始,一直到開方之后的數字sqr為止,不斷地將數字n2~sqe之間的數進行求余,如果求余結果為0,則表明n可以被整除,那么n就不是素數(因為素數只能被1和自己整除),返回false
  4. 如果for循環執行完都沒有返回返回false值,那么繼續執行,返回true

下面寫一道題練練手。

Sexy Primes

Sexy primes are pairs of primes of the form (p, p+6), so-named since "sex" is the Latin word for "six". (Quoted from http://mathworld.wolfram.com/SexyPrimes.html)

Now given an integer, you are supposed to tell if it is a sexy prime.

Input Specification:
Each input file contains one test case. Each case gives a positive integer N (≤10)

注意,上面的題目及代碼來自【刷題】2019年三月PAT甲級春考真題講解,原作者是merely塵埃。

#include <cstdio>
#include <cmath>
using namespace std;

bool isPrime(int n){
	if (n<=1) return false;
	int sqr = int(sqrt(1.0 * n));
	for(int i=2; i<=sqr; ++i){
		if(n % i == 0) return false;
	}
	return true;
}

int main(){
	int n;
	bool flag = true;
	scanf("%d", &n);
	if(isPrime(n)){
		if(isPrime(n-6)) printf("yes\n%d\n", n-6);
		else if(isPrime(n+6)) printf("yes\n%d\n", n+6);
		else flag = false;
	}
	else flag = false;
	if(!flag){
		while(!isPrime(n) || !( isPrime(n+6)||isPrime(n-6)) ) ++n;
		printf("no\n%d\n", n);
	}
	return 0;
}

具體做題步驟還是很簡單的,所以就不細說了。

不過值得注意的是后面的while(!isPrime(n) || !( isPrime(n+6)||isPrime(n-6)) ) ++n;中的判定條件,一定要注意順序,+應該在-前面。題目要求的是輸出較小的值,而或運算的特點是一旦遇到判定為真的值那么就直接輸出真,不會再繼續判定(所以如果isPrime(n+6)是真,那么isPrime(n-6)就不會運行,直接輸出真),所以n+6的判定應當放在前面。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM