题目1:
PAT (Basic Level) Practice (中文)1007 素数对猜想
题目详情:
思路:
1.利用乘法将100000以下的非素数标记,利用数组进行存储。
2.利用循环遍历数组,若未标记则记录一次。
3.具体细节见代码注释。
详细代码:
#include<iostream>
using namespace std;
int num[100000];//用于存储标记的数组
void feisu()
{
//利用乘法,即利用素数的定义,将所有非负数对应元素的值赋值为1
for (int i = 2; i < 100000; i++)
{
for (int j = 2; i * j < 100000; j++)
{
num[i * j] = 1;
}
}
}
int main()
{
feisu();//标记操作
int n, s = 0;//n为任意正整数N,s为满足题目条件的素数对数
cin >> n;
for (int i = 4; i <= n; i++)//从4循环到N
{
if (num[i] == 0 && num[i - 2] == 0)
s++;//若存在差值为2的素数对s则+1
}
cout << s << endl;//s即为所求
return 0;
}
题目2:
PAT (Basic Level) Practice (中文)1008 数组元素循环右移问题
题目详情:
思路:
1.题目要求不能使用新数组,就用一个临时变量,每次位移一位。
2.如果右移n位就位移n次。
3.具体细节见代码注释。
详细代码:
#include<iostream>
using namespace std;
int num[100];//用来存储具体数据
int main()
{
int m, n;
cin >> m >> n;
for (int i = 0; i < m; i++)
cin >> num[i];//将第2行数据录入
for (int i = 0; i < n; i++)//将数组右移n次
{
int tmp = num[m - 1];//最后一个数赋给临时变量tmp
for (int j = m - 1; j > 0; j--)//所有数右移1位
num[j] = num[j - 1];
num[0] = tmp;//最后一个数移动到第一位
}
for (int i = 0; i < m; i++)//打印新数组,直到最后一位不输出空格
{
cout << num[i];
if (i != m - 1)
cout << " ";
}
return 0;
}
题目3:
PAT (Basic Level) Practice (中文)1009 说反话
题目详情:
思路:
1.利用字符串来输入存储。
2.个人认为本题难点在于如何结束输入,可以利用getchar判断有无回车来判断输入是否结束。
3.具体细节见代码注释。
详细代码:
#include<iostream>
using namespace std;
char str[80][80];//字符串存储
int main()
{
int i = 0;
while (true)
{
cin >> str[i];
char c = getchar();//利用getchar,当输入回车时跳出循环
if (c == '\n')
break;
i++;
}
for ( i; i >= 0; i--)
{
cout << str[i];
if (i != 0)
cout << " ";
else
cout << endl;//最后一个字符串不输出空格
}
return 0;
}
题目4:
PAT (Advanced Level) Practice 1005 Spell It Right
题目详情:
思路:
1.本题的大体意思是将输入的数求和,并将每位数字按英文输出。
2.用数组代替if语句输出各位数字可以简化程序。
3.具体细节见代码注释。
详细代码:
#include<iostream>
using namespace std;
int main()
{
string n;//输入
int sum;
sum = 0;
cin >> n;
for (int i = 0; i < n.size(); i++)
{
sum += n[i] - '0';//转化为数值
}
int a[1000];
const char* num[] = { "zero","one","two","three","four","five","six","seven","eight","nine" };//用数组输出各位数字可以简化程序
int j;
for (j = 0; sum != 0; j++)//将每位数字分离
{
a[j] = sum % 10;//利用求余将每位数存进a数组
sum /= 10;
}
while (j > 0)//输出每一位数字
{
j--;
cout << num[a[j]];
if (j == 0)
{
cout << "\n";
break;
}
cout << " ";
}
return 0;
}
题目5:
PAT (Advanced Level) Practice 1008 Elevator
题目详情:
思路:
1.本题的大体意思天梯从0层开始启动,每层需要停留5秒,向上一层需要6秒,向下一层需要4秒。输入需要到达的楼层,输出所需时间,最后电梯不需要归位。
2.本题主要通过if语句判断是向上还是向下再进行具体计算累加到总时间变量time上。
3.具体细节见代码注释。
详细代码:
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int time = 5 * n;//总时间,每层停5秒
int temp = 0;//当前楼层
int p;//目标楼层
for (int i = 0; i < n; i++)
{
cin >> p;
if (p > temp)
time += 6 * (p - temp);//目标楼层在上面,花6秒
else
time += 4 * (temp - p);//目标楼层在下面,花4秒
temp = p;//更改目标楼层
}
cout << time;
return 0;
}
题目6:
PAT (Top Level) Practice 1001 Battle Over Cities - Hard Version
题目详情:
思路:
1.本题的大体意思是在战争中保卫城市,要在每座城市之间修筑公路,需要以最小代价来修筑公路并找到其中最重要的城市。
2.第一行输入n个城市,m条公路,之后每行输入起始点、成本和公路状态。之后程序运行,递增输出最需要的坚守的城市。
3.本题主要运用kustal算法求最小生成树。本解法比较巧妙的点是添加了一个记录图是否联通的一个变量,很好地满足了题目要求。本解法的大体思路是枚举每个城市都被占领的情况下,比较花费来找到最大花费,即最重要的城市。
4.本题学习自博客园博主LuckyRowlet的文章,特此感谢分享。连接:PAT (Top Level) Practice 1001 Battle Over Cities - Hard Version 题解 - LuckyRowlet - 博客园
详细代码: