从零单排PAT1009,1011,1012

这次将1009,1011,1012的题目贴出来,都是水题


1009

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。

输出格式:每个测试用例的输出占一行,输出倒序后的句子。

输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
 
这道题目的模型就是一个栈,陷入后出,但是单位是以连续的单词而不是字符,是这道题的难点。但是可以用C++中的sstream分割,用getline函数读取整行的数据。用c++中标准的类Stack进行操作,只要进行两三个操作弹栈pop(删除栈顶元素),入栈push(加入新的栈顶元素),得到栈顶元素gettop。代码如下:
#include <iostream>  
#include <stack>  
#include <string>  
#include <sstream>  
using namespace std;  
  
int main()  
{  
    stack<string> word;  //以栈的形式存放所有分开来的单词
    string s;
	stringstream ss;
	string a, b, c;
	getline(cin, s);   //输入字符串
	ss.clear(); 
	ss.str(s);
	while(1)  //将字符串分开
	{
		ss >> a;
		if(ss.fail())
			break;
		word.push(a); //将数据放入栈中
	}
	cout << word.top() ;   //访问栈顶元素,但是不删除
    <span style="white-space:pre">	</span>word.pop();					//弹栈,删除栈顶元素
	while(word.empty() == false)
	{
		cout << " " <<word.top() ;   //访问栈顶元素,但是不删除
		word.pop();					//弹栈,删除栈顶元素
	}
	system("pause");
	return 0;  
}  

1011

给定区间[-231, 231]内的3个整数A、B和C,请判断A+B是否大于C。

输入格式:

输入第1行给出正整数T(<=10),是测试用例的个数。随后给出T组测试用例,每组占一行,顺序给出A、B和C。整数间以空格分隔。

输出格式:

对每组测试用例,在一行中输出“Case #X: true”如果A+B>C,否则输出“Case #X: false”,其中X是测试用例的编号(从1开始)。

输入样例:
4
1 2 3
2 3 4
2147483647 0 2147483646
0 -2147483648 -2147483647
输出样例:
Case #1: false
Case #2: true
Case #3: true
Case #4: false
这题的难度不是在于计算,而是在于数据溢出,比如A和B相加或相减的值可能会溢出,那么就会影响结果,所以先进行不等式左边和右边的符号判断,若异号则能得出直接的结果;不异号,那么就改为判A是否大于C-B。但在符号判断时候,需要进行边界条件的考虑,把=0的情况考虑进去。代码如下:
#include <iostream>
#include <vector>

using namespace std;

bool judge(long int a,long int b,long int c) //传递参数,三个长整形,若返回false表示小于等于,返回true表示大于
{
	if((a>0 && b<0) || (a<0 && b>0))  //在异号的时候,直接判断
	{
		if(a + b > c)
			return true;
		else
			return false;
	}
	else //同号的情况下
	{
		if(a > 0 && c < 0)  //ab同号,c不同号 ab大于c
			return true ;
		else if(a < 0 && c > 0)  //ab同号,c不同号 ab小于c
			return true ; 
		else
		{
			if(a > (c-b))
				return true;
			else 
				return false;
		}
	}
}

int main()
{
	int n = 0;
	long int a,b,c;
	int count = 0;
	cin >> count;
	vector <bool> T;
	while(n != count)
	{
		cin >> a >> b >> c ;
		if(judge(a,b,c))   //如果判断正确,压入true;否则压入false
			T.push_back(true);
		else
			T.push_back(false);
		n++;
	}
	for(int i=0;i<count;i++) //依次输出答案
	{
		if(T[i])
			cout << "Case #" << i+1 << ": " << "true" <<endl;
		else
			cout << "Case #" << i+1 << ": " << "false" <<endl;
	}
	system("pause");
	return 0;
}

1012

给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:

  • A1 = 能被5整除的数字中所有偶数的和;
  • A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4...;
  • A3 = 被5除后余2的数字的个数;
  • A4 = 被5除后余3的数字的平均数,精确到小数点后1位;
  • A5 = 被5除后余4的数字中最大数字。

    输入格式:

    每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N,随后给出N个不超过1000的待分类的正整数。数字间以空格分隔。

    输出格式:

    对给定的N个正整数,按题目要求计算A1~A5并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。

    若其中某一类数字不存在,则在相应位置输出“N”。

    输入样例1:
    13 1 2 3 4 5 6 7 8 9 10 20 16 18
    
    输出样例1:
    30 11 2 9.7 9
    
    输入样例2:
    8 1 2 4 5 6 7 9 16
    
    输出样例2:
    N 11 2 N 9
    这道题目,我刚开始以为只要解决C++中有效位数的输出问题即可:cout<<fixed<<setprecision(1)<< a4 ,即可输出规定的有效位数;但是还有一个问题:输入的个数的确定,我这里没有再开辟一个新的Vector去存储,因为好像题目不允许,所以每次对读进来的变量进行判断,A1-A5分别用一个去存贮结果,用count0-count4去作为每个判断的标记,判断是否存在这个数(本来我以为可以从结果去判断是否存在,但是由于数字可以有正负,所以不能直接用==0来判断是否存在这些数,这是本题需要注意的地方)代码如下:
#include <iostream>
#include <iomanip> 

using namespace std;

int main()
{
	int result[5] = {0,0,0,0,0};   //1,2,3,5的结果
	bool count4 = false; //计算最大值的计数
	bool count3 = false; //计算平均数的计数
	bool count2 = false; //计算平均数的计数
	bool count1 = false; //计算被1整除的计数
	bool count0 = false; //计算所有偶数和计数
	int k = 0; //用于计数
	int j = 0;
	float a4 = 0; //4计算浮点数的结果
	int n = 0;    //计算输入多少个数据
	int temp = 0;  //用于暂存所有数据
	int i = 0;   //循环变量
	cin >> n;   
	for(int i=0;i<n;i++)
	{	
		cin >> temp;
		if(temp % 5 == 0 && temp %2 ==0)   //A1能被5整除的数字中所有偶数的和
		{
			count0 = true;      //置起标志位
			result[0] += temp;   //累加
		}
		else if(temp % 5 == 1)     //A2,能被5整除余1,交错求和
		{
			count1 = true ;  //置起标志位
			j ++ ; 
			if(j %2 == 1)
			{
				result[1] += temp;  //计数为奇数相加
			}
			else
			{
				result[1] -= temp;  //计数为偶数相减
			}
		}
		else if(temp % 5 == 2)  //A3被5除余2的个数
		{
			count2 = true ;
			result[2] ++;
		}
		else if(temp % 5 == 3)  //A4 被5整除余3的平均数  ,在外部计算
		{
			count3 = true;
			k ++ ;
			result[3] += temp;
		}
		else if(temp % 5 == 4)   //A5 被5整除余4最大的数字
		{
			count4 = true ;
			if (temp >= result[4])
				result[4] = temp;
		}
	}
	//进行所有的判断,若不存在,输出N
	if(count0 == true)
		cout << result[0] << " ";
	else
		cout << "N ";
	if(count1 == true)
		cout << result[1] << " ";
	else
		cout << "N ";
	if(count2 == true)
		cout << result[2] << " "; 
	else
		cout << "N ";
	if(count3 == true)
	{
		a4 = (float)result[3] / k;
		cout<<fixed<<setprecision(1)<< a4 << " "; //输出一位有效数字
	}
	else
		cout << "N ";
	if(count4 == true)
		cout << result[4] ;
	else
		cout << "N" ; 
	system("pause");
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值