紫皮书小练1

UVa272

基本的输出输出判断。。。
找到输入的双引号 改为其他符号,查找然后判断 增加一个判断是下引号还是上引号,输出即可!

#include
using namespace std;
int main()
{
    int c ,q = 1;
    while((c = getchar()) != EOF){
        if(c == '"'){
            printf("%s",q ? "``" : "''");
            q = !q;
        }
        else{
            printf("%c",c);
        }
    }
    return 0;
}

UVa10082

基本字符数组的 查找 下标使用
紫皮书中47页代码,字符数组中多了一个/ 。我去掉了一个ac,带着它仍然ac,不知道是什么地方出了问题,大概是测试数据不足吧。
大意:输出一行字符。找到字符在键盘上左边的字符,输出。。。

#include
using namespace std;
char s[] ={"`1234567890-=QWERTYUIOP[]\ASDFGHJKL;'ZXCVBNM,./"};
int main()
{
    int i,c;
    while((c = getchar())!=EOF){
        for(i = 1;s[i]&&s[i]!=c;i++);//找到该字符,i为该字符下标。
            if(s[i]) putchar(s[i-1]);
            else putchar(c);
    }
    return 0;
}

UVa401

大意:给你一个字符串,判断是否是回文串或是镜像串,
回文:正反读一样
镜像:题目中给了样例 如图紫皮书小练1_第1张图片
写一个字符串保存所有有镜像字符
紫皮书中写了一个很巧妙的方法 确实厉害

#include
using namespace std;
const char* rev = "A   3  HIL JM O   2TUVWXY51SE Z  8 ";
const char* msg[] = {"-- is not a palindrome.","-- is a regular palindrome.",
"-- is a mirrored string.","-- is a mirrored palindrome."};

char r(char ch)
{
    if(isalpha(ch)) return rev[ch-'A'];
    return rev[ch-'0'+25];
}

int main()
{
    char s[30];
    while(scanf("%s",s) == 1){
        int len = strlen(s);
        int p = 1, m = 1;
        for(int i = 0;i < (len+1)/2; i++){
            if(s[i] != s[len-1-i]) p = 0;//不是回文
            if(r(s[i]) != s[len-1-i]) m =0;//不是镜像
        }
        printf("%s %s\n\n",s,msg[m*2+p]);
        /*msg   l = m*2+p 巧妙的组合
        m = 1 p = 1:l = 3    镜像且回文
        m = 0 p = 0:l = 0   不镜像也不回文
        m = 1 p = 0:l = 2   镜像
        m = 0 p = 1:l = 1   回文
        恰好与字符数组msg对应 真厉害!*/
    }
    return 0;
}

先写这三个吧,还有其他的事情~
继续奋斗,我想要拿个奖,(^▽^)~~~~

你可能感兴趣的:(----acm---,紫皮书)