UVA333 题解

· · 题解

大意:

给定一个字符串 s 判断 s 是否符合要求。

  1. 由数字,- 和大写英文数字 X,空格组成,X 代表 10 且只能在最后出现。

  2. 依次相加前面的数字的总和可以被 11 整除,也就是前缀和,而且刚好 s 只有 10 个数字。

坑点:

  1. \r 换行与空格。

你写完代码在洛谷IDE运行时,你会发现莫名换行,这是因为 getline 把样例中的 \r 读入,才会换行,不要想办法改正常,会错!在本地测即可。

  1. 前后多余空格。

需要写一个函数来把前后多余空格给删除。

string& getstr(string &s){
      //来自chatGPT。 
    if(s.empty()) return s;
    s.erase(0,s.find_first_not_of(" "));
    s.erase(s.find_last_not_of(" ")+1);
    return s;
}

虽然来自 chatGPT,但是来说一下原理是什么。

思路:

照着题面意思写即可。

while(getline(cin,s));
    int q,w,sz;
    q=w=sz=0;
    for(int i=0;i<s.size();i++){
        if(s[i]>='0'&&s[i]<='9'){
            q+=s[i]-'0';//数字  前缀和 
            w+=q;
            sz++;
        }else if(s[i]=='X'){
            if(sz!=9){
                return false;//X 不是最后一个 
            }
            q+=10;
            w+=q;
            sz++;
        }else if(s[i]!='-'&&s[i]!=' '){
            return false;//其他字符 
        }
    }
    if(w%11==0&&sz==10){
        return true;
    }else{
        return false;
    }

代码:

思路很详细了,坑点已经列出来了,代码就不放了。