UVA333 题解

发布时间 2023-08-04 13:31:39作者: _zzzhhhzzz

## 大意:

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

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

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

---

## 坑点:

1. `\r` 换行与空格。

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

---

2. 前后多余空格。

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

```cpp
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(" ")` 字符串中第最后一个出现的空格。

---

## 思路:

照着题面意思写即可。

- 若干个字符串输入。

```cpp
while(getline(cin,s));
```
- 判断函数。

```cpp
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;
}
```
---
## 代码:

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