poj1047

一开始以为每次只需要判断一个数字就行,判断完一个数字后程序就结束了,没有考虑处理多组数字。。。没想到是有多组输入的,导致后面出了一些问题。。。因为用了好几个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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值