PTA练习01

题目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 - 博客园

详细代码:

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值