PAT刷题记录2019/5/22——2019/5/23——19/525

B 1009 说反话

gets和scanf区别

scanf&gets&getchar

scanf() 的%s会忽略行开头的所有空格,并以空格、换行符结束输入,自动在字符串后面添加字符串结束符'\0',因此开字符数组时记得数组长度一定要比实际存储的字符串的长度至少多一;回车,空格仍会留在输入的缓冲区中,可以使用getchar()读取scanf语句执行后,缓冲区留下的回车空格。scanf的%c可以读取空格换行

gets()读入以任何字符开始的字符串,以换行符结束,但之后会丢弃缓冲区中换行符并以'\0'代替;

注意:int型数组的末尾不需要加'\0',只有字符型数组需要。

第一:要注意不同的函数是否接受空格符、是否舍弃最后的回车符的问题!
读取字符时:
scanf()以Space、Enter、Tab结束一次输入,不接受空格符,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
getchar()以Enter结束输入,接受空格符,也不会舍弃最后的回车符;
读取字符串时:
scanf()以Space、Enter、Tab结束一次输入,不接受空格,回车符残留在缓冲区
gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!

注意:用C++编译器时,会出现 error: ‘gets’ was not declared in this scope ,解决办法;用C编译器不会出错。

*字符型二维数组可当作字符串数组使用。

*注意给每个字符串末尾手动添加结束符'\0'

B 1014/A 1061 福尔摩斯的约会

。。。。。够够的了,这道题我改了两个小时。。。。。。题目表述不清楚

福尔摩斯的约会坑点详解

啥也不想说了

B 1024/A 1073 科学计数法

不算难题,但是分析起来比较复杂,要理清头绪。

将zi

字符串分解为符号、实数、E、指数部分

1.找到E的位置pos;

2.将指数部分字符串转为整数

3.分类讨论指数正负以及0的处理

#include <cstdio>
#include <cstring>
//字符串分解,符号、实数、E、指数
int main(){
    char str[10010];
    scanf("%s",str);
    int len=strlen(str);
    if(str[0]=='-')
        printf("-");
//获得E位置
    int pos=0;
    while(str[pos]!='E'){
        pos++;
    }
//获得指数
    int exp=0;
    for(int k=pos+2;k<len;k++){
        exp=exp*10+(str[k]-'0');
    }
//分类讨论指数正负
//指数为零,输出实数部分
    if(exp==0){
        for(int k=1;k<pos;k++){
            printf("%c",str[k]);
        }
    }
//指数为负,输出0.,在输出exp-1个0,输出去掉小数点的实数
    else if(str[pos+1]=='-'){
        printf("0.");
        for(int k=0;k<exp-1;k++){
            printf("0");
        }
        printf("%c",str[1]);
        for(int k=3;k<pos;k++){
            printf("%c",str[k]);
        }
    }
//指数为正,分类讨论
    else{
        int count=pos-3;//小数点后数字位数
        if(count==exp){
            printf("%c",str[1]);
            for(int k=3;k<pos;k++){
                printf("%c",str[k]);
            }
        }
        else if(exp>count){
            printf("%c",str[1]);
            for(int k=3;k<pos;k++){
                printf("%c",str[k]);
            }
            for(int k=0;k<(exp-count);k++){
                printf("0");
            }
        }
        else{
            for(int k=1;k<pos;k++){
                  if(str[k]=='.')
                   continue;
                printf("%c",str[k]);
                if(k==exp+2)
                   printf(".");
            }
        }
        return 0;
    }
}

B 1048 数字加密

坑:题目表述不清楚,字符串长度不一样要补0,接着运算;如果算到最短的然后复制剩下内容会有两个测试用例出错。

A 1001 A+B Format

没什么要说的

A 1005 Spell it right

.............

A 1035 Password

................

A 1077 Kuchiguse

求公共后缀问题

注意点读取n之后要用getchar()接收后面的换行符,否则会导致cin.getline()读取到换行符,导致出错

不满足条件想要跳出双重循环可以用break(跳出里层循环)+bool flag(跳出最外层循环)实现

for(int i=0;i<min;i++){
        char ch=array[0][i];// 取出第i个字符
        bool flag=true;
        for(int j=1;j<n;j++){
            if(array[j][i]!=ch){
               flag=false;
               break;
            }    
        }
        if(flag){
            ans++;
        }
        else
            break;
    }

A 1082 Read in Chinese

有点复杂,再说吧,想换个题型了。

B 1015/A 1062 德才论

在#include <algorithm>头文件下有sort()函数;

C++排序函数的调用

猜你喜欢

转载自blog.csdn.net/kungfu_rabbit/article/details/90440150