西北大學上機題——素數系列問題
題目一:輸出熱身
題目描述:輸入一個整數,如果這個數字大於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;
}
運行測試: