[PAT Basic Level] 1009、1010、1011、1012

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",&para,&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型范围是 2 31 -2^{31} ~ 2 31 1 2^{31}-1 ,所以甚至有些值直接无法用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. 数字分类

题目分析:

这道题也是有一个坑,题目描述里的 “ A 1 = A_1= 能被5整除的数字中所有偶数的和” 这句话的意思其实指的是第一类的数需要同时满足既能被5整除,又能被2整除。综合看其他条件很容易理解成根据数对5求模的余数分成5类,这样会导致有两个测试点通过不了。不过仔细考虑,如果仅满足是5的倍数,那么最后可能一个是偶数的都没有,那么也没法求和了。

明确这一点后,其余的按照题目要求来做就行,另外有一点要注意的是,如果像我一样一开始就用的浮点数来存 A 1 A_1 ~ A 5 A_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;
}
发布了11 篇原创文章 · 获赞 1 · 访问量 71

猜你喜欢

转载自blog.csdn.net/weixin_44452361/article/details/104634336