您的位置:首页 > 编程语言 > Go语言

uva 333 Recognizing Good ISBNs

2017-04-22 13:38 127 查看
题目:给了ISBN的语法规则,10个数字(最后一个可以为X代表10),10个数字之间可以有任意一个空格和连接符-,最后10个数字依次相加组成s1,s1依次相加组成s2,如果s2可以被11整除。则是一个正确的序列

注意:不输出首尾空格,而c++中并没有trim函数,需要自己写。

数字之间也可以有空格

首尾也可以有连接符

string不能用printf输出

char  a[100],cin>>a   或者  string a ,cin>>a 都不会读入空格,而是把空格当成了新输入的开始。用getline(cin,a)可以

#include <cstdio>
#include <string.h>
#include <cstdlib>
#include <cmath>
#include <ctgmath>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/*
before 数前分析
isbn 数中分析
after 数后分析
calculate 计算
*/
bool IfNum(char m){
if(m>='0' && m<='9') return 1;
else return 0;
}
std::string& trim(std::string &s)
{
if (s.empty())
{
return s;
}

s.erase(0,s.find_first_not_of(" "));
s.erase(s.find_last_not_of(" ") + 1);
return s;
}
int main(){
enum Status{before,isbn,after,calculate,error};
char m;
//char str[1000];//存读入的数字
string str;
Status state;
while(getline(cin,str)){
trim(str);//去掉首尾的空格
int i = 0;
m = str[i];
state = before;
int s1,s2;
s1=s2=0;
int NoNum = 0;//第几个数字计数
while (m != '\0') {
switch (state) {
case before:{
if(IfNum(m)){
state = isbn;
s1 += m - '0';
s2 += s1;
NoNum++;
}
else if(m != '-' ) state = error;
break;

}
case isbn:{
if(IfNum(m) && NoNum <= 9){
state = isbn;
s1 += m - '0';
s2 += s1;
NoNum++;
if(NoNum == 9) state = after;
}
else if(m != '-' && m != ' ') state = error;
break;
}
case after:{
if(IfNum(m)){
state = calculate;
s1 += m - '0';
s2 += s1;
NoNum++;
}
else if(m == 'X'){
state = calculate;
s1 += 10;
s2 += s1;
NoNum++;
}
else if(m != '-' && m != ' ') state = error;
break;
}
case calculate:{
if(m == ' ' || m == '-'){
state = calculate;
}
else state = error;
break;
}
case error: goto lable;

}

m = str[++i];
}//处理完一整句
lable:
if (state == calculate) {
if (s2%11==0)  {
//str.erase(str.begin()+BlackPosition, str.end());
cout<<str; printf(" is correct.\n");
}
else {
cout<<str; printf(" is incorrect.\n");
}

}
else if (state == error)  {
cout<<str; printf(" is incorrect.\n");
}
else {
cout<<str; printf(" is incorrect.\n");
}

}

return 0;
}

/*
--08-2----302--5713------
0-89  2 37-010-6
0-8306-3637-4
0-06-017758-6

This_is_garbage
1-56884-030-6
0-8230-2571-3
0-345-31386-0
0-671-88858-7
0-8104-5687-7
0-671-74119-5
0-812-52030-0
0-345-24865-1-150
0-452-26740-4
0-13-139072-4
0-1315-2447-X
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  有限自动机 enum