西北大學上機題——素數系列問題

西北大學上機題——素數系列問題

題目一:輸出熱身
題目描述:輸入一個整數,如果這個數字大於0,則輸出1,等於0,輸出0,小於0,輸出-1.
輸入描述:每次輸入1個整數
輸出描述:輸出0或1或-1
洋例輸入:34
樣例輸出:1

#include<iostream>
using namespace std;
int function(int num) {
	if (num > 0)
		return 1;
	else if (num == 0)
		return 0;
	else
		return -1;
}
int main() {
	int n;
	cout << "輸入測試次數:";
	cin >> n;
	int num;
	while (n--) {
		cout << "輸入數字:";
		cin >> num;
		cout << function(num) << endl;
	}
	return 0;
}

運行測試:
在這裏插入圖片描述
題目二:素數判斷
題目描述:給定一個正整數,請判斷其是否爲素數(除了1和本身,沒有其他約數的數稱爲素數)
輸入描述:
輸入數據只包含一個整數N(0<n<1000)
輸入描述:
如果N是素數請輸出yes,否則輸出no
樣例輸入:5
樣例輸出:yes

#include<iostream>
#include<cmath>
using namespace std;
bool isPrime(int num) {
	if (num == 1)
		return false;
	if (num == 2)
		return true;
	if (num % 2 == 0)
		return false;
	for (int i = 3;i <= sqrt(num);i = i + 2) {
		if (num % i == 0)
			return false;
	}
	return true;
}
int main() {
	int n;
	cout << "輸入測試次數:";
	cin >> n;
	int num;
	while (n--) {
		cout << "輸入數字:";
		cin >> num;
		if (isPrime(num))
			cout << "yes" << endl;
		else
			cout << "no" << endl;
	}
	return 0;
}

運行測試:
在這裏插入圖片描述
題目三:素數統計
題目描述:給定若干個正整數,請判斷素數的個數。
輸入數據首先包含一個正整數N(1<=N<=100)表示數據的個數,然後是N個大於1小於10000的整數
請判斷並輸出給定的N個數中素數的個數
樣例輸入:5 3,4,8,9,11
樣例輸出:2

#include<iostream>
#include<cmath>
using namespace std;
bool isPrime(int num) {
	if (num == 1)
		return false;
	if (num == 2)
		return true;
	if (num % 2 == 0)
		return false;
	for (int i = 3;i <= sqrt(num);i = i + 2) {
		if (num % i == 0)
			return false;
	}
	return true;
}
int main() {
	int n;
	cout << "輸入數字個數:";
	cin >> n;
	int* num = new int[n];
	int count = 0;
	cout << "輸入數字:";
	for (int i = 0;i < n;i++) {
		cin >> num[i];
		if (isPrime(num[i]))
			count++;
	}
	cout << "素數個數:" << count << endl;
	return 0;
}

運行測試:
在這裏插入圖片描述
題目四:絕對素數
題目描述:絕對素數是指本身是素數,其逆序也是素數的數,例如:107餘701是絕對素數。求[ m,n ]範圍之內的所有絕對素數。
輸入描述:輸入兩個正整數m和n,其中m<n
輸出描述:輸出[ m,n ]之間的絕對素數
樣例輸入:
105 120
樣式輸出:
107 113

#include<iostream>
#include<cmath>
using namespace std;
bool isPrime(int num) {//判斷是否是素數
	if (num == 1)
		return false;
	if (num == 2)
		return true;
	if (num % 2 == 0)
		return false;
	for (int i = 3;i <= sqrt(num);i = i + 2) {
		if (num % i == 0)
			return false;
	}
	return true;
}
int reaverse(int num) {//求一個數的逆序數
	int temp;
	int reNum = 0;
	while (num / 10) {
		temp = num % 10;
		reNum = reNum * 10 + temp;
		num = num / 10;
	}
	reNum = reNum * 10 + num;
	return reNum;
}
int main() {
	int m, n;
	cout << "輸入範圍:";
	cin >> m >> n;
	for (int i = m;i <= n;i++) {
		if (isPrime(i) && isPrime(reaverse(i))) {
			cout << i << endl;
		}
	}
	return 0;
}

在這裏插入圖片描述
題目五:超素數
題目描述:如果一個數是素數,並且能夠被分解爲C(C>=2)個連續素數的和,則稱這個數爲超素數,請編程判斷一個數是否是超素數。
輸入描述:
輸入數據僅僅包含一個正整數N(1<N<100000)
輸出描述:
如果給定的整數N爲超素數。請輸出yes,否則請輸出no
樣例輸入:
5
樣例輸出:
yes

算法思路:先找出小於N的所有素數,從這些素數的子序列中尋找和等於N的子序列,通過兩個工作指針p,q一個指向序列的開始,一個指向序列的末尾,開始時p指向第一個素數,q指向小於N的最後一個素數,若子序列的和比N小,則p後移,若和比N大,則q前移,否則,即找到了和等於N的連續素數系列。

#include<iostream>
#include<cmath>
using namespace std;
bool isPrime(int num) {//判斷是否是素數
	if (num == 1)
		return false;
	if (num == 2)
		return true;
	if (num % 2 == 0)
		return false;
	for (int i = 3;i <= sqrt(num);i = i + 2) {
		if (num % i == 0)
			return false;
	}
	return true;
}
int sumArr(int arr[], int m, int n) {//計算數組中從m到n的元素之和
	int sum = 0;
	for (int i = m;i <= n;i++)
		sum += arr[i];
	return sum;
}
bool isSuperPrime(int num) {
	if (!isPrime(num))
		return false;
	int arr[100];
	int length = 0;
	for (int i = 1;i < num;i++) {
		if (isPrime(i)) {
			arr[length] = i;
			length++;
		}
	}
	int p = 0, q = length - 1;
	while (p < q) {
		int sum = sumArr(arr, p, q);
		if (sum == num)
			return true;
		else if (sum > num)
			q = q - 1;
		else
			p = p + 1;
	}
	return false;
}
int main() {
	int n;
	cout << "輸入測試次數:";
	cin >> n;
	int num;
	while (n--) {
		cout << "輸入數字:";
		cin >> num;
		if (isSuperPrime(num))
			cout << "yes" << endl;
		else
			cout << "no" << endl;
	}
	return 0;
}

運行測試:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章