1009. 说反话
题目分析:
这道题,难度不大,但是要写的精炼还需要熟练掌握一些库函数,如果纯靠自己自己编相应的代码会稍微复杂一些。我对这些库函数不太熟悉,自己写了一个,后来在网上看到了人家写的更便捷的实现。贴出来别人的优质代码和自己写的,做一个比较吧。
源代码(本人)
#include <stdio.h>
int main()
{
int sentence[81];
int count=0;
int len[80]; //不超过80个单词,故存储单词长度的数组不超过80
int order=0; //记录单词序号
int size=0;
while(true) { //遇到文件尾或者换行符时退出
sentence[count]=getchar();
if(sentence[count]==EOF||sentence[count]==10){
len[order]=size; //记录最后一个字符的长度
break;
}
if(sentence[count]==' '){ //遇到空格
len[order++]=size;
size=0;
}
else size++;
count++;
}
while(order){ //循环一直到第一个单词
count-=len[order];
for(int i=0;i<len[order];++i)
printf("%c",sentence[count+i]);
printf(" ");
count--;
order--;
}
for(int i=0;i<len[0];++i)
printf("%c",sentence[i]);
return 0;
}
源代码(来源网络,出处见代码下面的链接)
C语言版(需要用gcc编译器汇编,g++编译会显示编译错误)
#include<stdio.h>
#include <string.h>
int main(){
char s[100]="";
gets(s);
if(strchr(s,' ')==NULL){
printf(s);
}else{
while(strchr(s,' ')!=NULL){
printf("%s ", strrchr(s,' ')+1);//加1操作主意是试指针后移一位(char字符的长度!!!char字符的长度为1)
*strrchr(s,' ')=0;
}
printf("%s",s);
}
return 0;
}
C++版
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main(){
string s;
stack<string>st;
while(cin>>s){
st.push(s);
}
cout << st.top();
st.pop();
while(!st.empty()){
cout<<' '<<st.top();
st.pop();
}
return 0;
}
版权声明:本文为CSDN博主「JeffreyDDD」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jeffreyddd/article/details/78395267
1010. 一元多项式求导
题目分析:
题目本身也不是太复杂,不过PAT乙级题目出题人总是让我感觉说话不说清楚,似是而非,隐隐约约透露出点意思但如果不仔细琢磨和验证就容易会错意,在1012也发生了类似的情况。这里注意,当没有可输出的值(所有项求导后系数均为0),或者遇到输入的值中系数与指数均为0的情况,就应该仅输出0 0。把题目真正想让你做的弄清楚之后,实现就没什么难度了。
源代码
#include <stdio.h>
int main()
{
int para,exp;
int count=0; //用来指示当前是不是第一个可输出值
while(scanf("%d %d",¶,&exp)!=EOF){
para*=exp;
exp--;
if(para){
if(count) printf(" "); //非第一个元素,则输出一个空格
printf("%d %d",para,exp);
count++;
}
}
if(count==0)
printf("0 0");
}
1011. A+B和C
题目分析
这道题稍微要注意的一个点就是题目所给的范围,所产生的运算已经可能会超出int型变量能够表示的范围了。int至少是16位,大部分机器上是32位,32位有符号int型范围是 ~ ,所以甚至有些值直接无法用int保存。那么很自然就想到用64位长整型long long,那么所有的加减运算都不会溢出。虽说用int也行,但需要对溢出的情况单独处理,有些繁琐了,还是用long long来的简洁方便
源代码
#include <stdio.h>
int main()
{
long long numA,numB,numC;
int caseNumber;
scanf("%d",&caseNumber);
int i=1;
while(caseNumber--){
scanf("%lld %lld %lld",&numA,&numB,&numC);
if(i>1) printf("\n");
if(numA+numB>numC)
printf("Case #%d: true",i++);
else printf("Case #%d: false",i++);
}
return 0;
}
1012. 数字分类
题目分析:
这道题也是有一个坑,题目描述里的 “ 能被5整除的数字中所有偶数的和” 这句话的意思其实指的是第一类的数需要同时满足既能被5整除,又能被2整除。综合看其他条件很容易理解成根据数对5求模的余数分成5类,这样会导致有两个测试点通过不了。不过仔细考虑,如果仅满足是5的倍数,那么最后可能一个是偶数的都没有,那么也没法求和了。
明确这一点后,其余的按照题目要求来做就行,另外有一点要注意的是,如果像我一样一开始就用的浮点数来存 ~ 的值的化,输出整形需要使用强制类型转换,光在printf中声明整形输出不够,需要显示进行转换。而且计算平均值的时,也需要将和显示转化成double型再进行除法运算才能得到正确结果,否则编译器会默认对两个整数进行整数除法,再将得到的整数扩展成double值。
源代码
#include <stdio.h>
int main()
{
int caseSize;
scanf("%d",&caseSize);
int *value=new int[caseSize];
int count[5]={0,0,0,0,0};
double classValue[5];
int sum1=0,sum2=0,sum4=0; //记录A1、A2、A4类中数字的和
int max5=-1; //记录A5类中数字最大值,初始化为-1
for(int i=0;i<caseSize;++i){
scanf("%d",&value[i]);
int remainder=value[i]%5;
switch (remainder)
{
case 0:{
if(value[i]%2==0){
count[0]++;
sum1+=value[i];
}
break;
}
case 1:{
count[1]++;
if(count[1]%2==0) //若当前为A2中偶数项
value[i]=-value[i]; //变为负值
sum2+=value[i];
break;
}
case 2: count[2]++; break;
case 3: count[3]++;sum4+=value[i]; break;
default:{
count[4]++;
if(max5<value[i]) max5=value[i];
break;
}
}
}
classValue[0]=sum1;
classValue[1]=sum2;
classValue[2]=count[2];
classValue[3]=(double)sum4/count[3];
classValue[4]=max5;
//输出:
for(int i=0;i<4;++i){
if(count[i]){
if(i!=3) printf("%d ",(int)classValue[i]);
else printf("%.1f ",classValue[3]);
}
else printf("N ");
}
if(count[4]) printf("%d",(int)classValue[4]);
else printf("N");
delete []value;
return 0;
}