PAT乙級1006/1007
阿新 • • 發佈:2021-02-04
技術標籤:PAT練題
1006 換個格式輸出整數 (15 分)
讓我們用字母 B 來表示“百”、字母 S 表示“十”,用 12…n 來表示不為零的個位數字 n(<10),換個格式來輸出任一個不超過 3 位的正整數。例如 234 應該被輸出為 BBSSS1234,因為它有 2 個“百”、3 個“十”、以及個位的 4。
輸入格式:
每個測試輸入包含 1 個測試用例,給出正整數 n(<1000)。
輸出格式:
每個測試用例的輸出佔一行,用規定的格式輸出 n。
輸入樣例 1:
234
輸出樣例 1:
BBSSS1234
基本思路是考慮到個位為0及個位十位均為0的情況,將所有數分為一位數、兩位數、三位數三類分別進行討論。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
int ge, shi, bai;
cin >> n;
if(n<10){
for (int i = 1; i <= n; i++) {
cout << i;
}
}else if(n==10){
cout << "S";
}
else if (n > 10 && n < 100) {
ge = n % 10;
shi = n / 10;
for (int i = 1; i <= shi; i++) {
cout << "S";
}
for (int i = 1; i <= ge; i++) {
cout << i;
}
}
else if (n >= 100) {
ge = n % 10;
n = n / 10;
shi = n % 10;
bai = n / 10;
for (int i = 1; i <= bai; i++) {
cout << "B";
}
if (shi == 0) {
if (ge== 0) {}
else {
for (int i = 1; i <= ge; i++) {
cout << i;
}
}
}
else {
for (int i = 1; i <= shi; i++) {
cout << "S";
}
if(ge==0){}
else {
for (int i = 1; i <= ge; i++) {
cout << i;
}
}
}
}
system("pause");
return 0;
}
他解1:通過一步一步從從前至後計算各位數字然後輸出的方法,在每步排除了各位為0的情況。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
int ge, shi, bai;
cin >> n;
bai = n / 100;
if (bai != 0) {
for (int t = 0; t < bai; t++)
cout<<"B";
}
shi = (n - bai * 100) / 10;
if (shi != 0) {
for (int t = 0; t < shi; t++)
cout << "S";
}
ge = n - bai * 100 - shi * 10;
for (int i = 1; i <= ge; i++)
cout<<i;
system("pause");
return 0;
}
1007 素數對猜想 (20 分)
讓我們定義dn為:dn=p(n+1)−p(n),其中pi是第i個素數。顯然有d1=1,且對於n>1有dn是偶數。“素數對猜想”認為“存在無窮多對相鄰且差為2的素數”。
現給定任意正整數N(<10^5),請計算不超過N的滿足猜想的素數對的個數。
輸入格式:
輸入在一行給出正整數N。
輸出格式:
在一行中輸出不超過N的滿足猜想的素數對的個數。
原本做的時候是先判斷素數,然後再提出相差為2的各對,後來檢視其它解法時發現多是用原始自然數直接判斷相差為2的兩數是否都為素數。
原本以為是不能用本人的這種方法最後分析發現居然是素數的判斷函數出了差錯…
初始想法程式碼:把所有素數提出然後看相差2的對數情況
#include <bits/stdc++.h>
using namespace std;
bool isPrime(int x)
{
if (x == 1) {
return false;
}
else if (x == 2 || x == 3) {
return true;
}
else {
for (int i = 2; i * i <= x; i++)
{
if (x % i == 0) {
return false;
}
}
return true;
}
}
int main() {
int N; int count = 0;
cin >> N;
int s[100000]; int j = 0;
for (int i = 2; i <= N; i++) {
if (isPrime(i)) {
s[j] = i;
// cout << s[j]<<" ";
j++;
}
}
// cout << "check" << endl;
//sort(s, s + j);
for (int i = 0; i < j - 1; i++) {
if (i != j - 1) {
if (s[i + 1] - s[i] == 2) {
count++;
// cout << s[i] << " " << s[i + 1] << " ";
}
else {
}
}
}
cout << count;
system("pause");
return 0;
}
對於本人的這種方法在判斷相差為2時,網上也有用如下方式判斷的:
// 上一個素數
int lastPrime=2;
// 計算素數對個數
for(int i=3;i<=N;i+=2){ // 偶數除了2一定不是素數
// 找到新的素數
if(isPrime(i)){
// 判斷是否為素數對
if(i-lastPrime==2){ //兩個素數之差為2
count++; // 計數
}
// 更新上一個素數
lastPrime=i;
}
}
另解1:直接在自然數序列中判斷相差為2 且 都為素數的對
#include <bits/stdc++.h>
using namespace std;
bool isPrime(int x)
{
for (int i = 2; i * i <= x; i++)
{
if (x % i == 0)
return false;
}
return true;
}
int main() {
int N; int count = 0;
cin >> N;
int s[100000]; int j = 0;
for (int i = 2; i <= N-2; i++) {
if (isPrime(i) && isPrime(i+2)) {
count++;
}
}
cout << count;
system("pause");
return 0;
}