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,但是来说一下原理是什么。

  • s.empty() 判断字符串 \(s\) 是否为空。

  • s.erase() 删除该位置的字符。

  • s.find_first_not_of(" ") 字符串中第 \(1\) 出现的空格。

  • s.find_last_not_of(" ") 字符串中第最后一个出现的空格。


思路:

照着题面意思写即可。

  • 若干个字符串输入。
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;
	}

代码:

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

posted @ 2023-08-04 13:28  _zzzhhhzzz  阅读(53)  评论(0)    收藏  举报