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)可以
注意:不输出首尾空格,而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 */
相关文章推荐
- UVA 494 Kindergarten Counting Game
- uva 10273 Eat or Not to Eat?
- UVA - 11300 Spreading the Wealth
- UVa 536 - Tree Recovery
- 【UVA】10318-Security Panel(DFS 回溯)
- uva 11520
- Uva -1515 Pool construction(最小割)
- uva10310(SuperSale)
- 【NOIP提高组2015D2T1】uva 714 copying books【二分答案】——yhx
- UVA 11462 Age Sort 计数排序 .
- Uva - 1588 - Kickdown
- UVa11077-Find the Permutations(dp+置换)
- UVA 531 Compromise
- UVA 11021 - Tribles
- UVA 10066 shuangzita...
- UVA 11078
- UVA 10791 Minimum Sum LCM
- UVa129 - Krypton Factor 不错的DFS入门题
- uva 10003Cutting sticks(动态规划水题)
- UVA 11806-Cheerleaders-容斥原理+组合数打表