一开始以为每次只需要判断一个数字就行,判断完一个数字后程序就结束了,没有考虑处理多组数字。。。没想到是有多组输入的,导致后面出了一些问题。。。因为用了好几个return语句。。。。除此之外,这道题还是思路比较清晰的~~
一般acm中只要没限制case个数的 就用while(cin>>i) i为要输入的数据 评判系统会自己输入^Z的 你就不用担心了
这是discuss里面有人说的,也算是一个小经验吧~~
有一个小技巧,用一个bool类型的IsDigital数组来表示数字0到9最开始有没有出现在要判断的数字里面,如果相乘之后产生了新的数字,则说明不可能是回文数~~~
一些测试数据:
142857 0588235294117647 052631578947368421 0434782608695652173913 0344827586206896551724137931 0212765957446808510638297872340425531914893617 0169491525423728813559322033898305084745762711864406779661 016393442622950819672131147540983606557377049180327868852459 01 758241 0588235294117646 152631578947368421 04347826086956521739130 034482758620689655172413793 0212765957446808501638297872340425531914893617 0169491525423728813559322033898305084745762711864406779666 485767305968737584736478947631110239847564719283674623819109 999999999999999999999999999999999999999999999999999999999999 142857 is cyclic 0588235294117647 is cyclic 052631578947368421 is cyclic 0434782608695652173913 is cyclic 0344827586206896551724137931 is cyclic 0212765957446808510638297872340425531914893617 is cyclic 0169491525423728813559322033898305084745762711864406779661 is cyclic 016393442622950819672131147540983606557377049180327868852459 is cyclic 01 is not cyclic 758241 is not cyclic 0588235294117646 is not cyclic 152631578947368421 is not cyclic 04347826086956521739130 is not cyclic 034482758620689655172413793 is not cyclic 0212765957446808501638297872340425531914893617 is not cyclic 0169491525423728813559322033898305084745762711864406779666 is not cyclic 485767305968737584736478947631110239847564719283674623819109 is not cyclic 999999999999999999999999999999999999999999999999999999999999 is not cyclic
#include<iostream> #include<vector> #include<string> using namespace std; const int TotalDigital = 10; int main() { vector<unsigned short> a; bool IsOcur[TotalDigital]; string s; bool GoNext; int i,j,n; while(cin>>s) { GoNext = false; memset(IsOcur,false,sizeof(bool)*TotalDigital); n = s.size(); for(i=0; i<n; ++i) { a.push_back(s[i]-'0'); IsOcur[s[i]-'0'] = true; } vector<unsigned short> b=a; for(i=2; i<=n; ++i) { for(j=n-1; j>=0; --j) { b[j] += a[j]; if(b[j]>=10)//有进位 { if(j>=1) { b[j] -= 10; ++b[j-1]; } else//位数大于原数的位数,不可能是回文数 { cout<<s<<" is not cyclic"<<endl; GoNext = true; break; } } if(IsOcur[b[j]]==false)//相加之后出现原数中未出现过的数字,不可能是回文数 { cout<<s<<" is not cyclic"<<endl; GoNext = true; break; } } if(GoNext) break; for(j=0; j<n; ++j)//在b中找到与a[0]相等的那一位,注意,可能有多个相等的,要看从该位开始循环是否符合回文 { if(b[j] == a[0]) { int t,k; for(t=j+1, k=1; t<n; ++t)//从b[t]开始一直到b[n-1]位与a[1]到a[n-j-1]位进行比较 { if(b[t]!=a[k]) break; ++k; } if(t==n) { for(t=0; k<n; ++k)//比较剩下的部分 { if(b[t]!=a[k]) break; ++t; } } if(k==n)//符合回文 break; } } if(j==n)//找遍b中与a[0]相等的位,从这些位开始循环都不满足回文性质 { cout<<s<<" is not cyclic"<<endl; break; } } if(i>n) cout<<s<<" is cyclic"<<endl; a.clear(); } return 0; }