1439: 可排回文
时间限制: 1 Sec 内存限制: 128 MB提交: 331 解决: 71
[ 提交][ 状态][ 讨论版]
题目描述
回文数指从左向右读和从右向左读是一样大的数(如32123,173371都是回文数)。
现在我们定义只要经过排列后能形成回文的数叫做"可排回文数"(如112,可重排为回文数121,则可称112为可排回文数)。
下面请编写程序判断一个数是不是“可排回文数”。
输入
一个非负整数N,如果N是-1,结束输入。(N<10^1000000)
输出
如果满足条件输出Yes,否则输出No。
样例输入
1
112
123
-1
样例输出
Yes
Yes
No
提示
当0-9的数字,有超过2个的数字是奇数个,则不可能组成回文数。
还有一种情况是 当100,有1个数字是奇数个,但只有偶数个零,也是不能的。
上代码
#include <iostream>
#include <queue>
#include<cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
char num[10000];
int flag[10];
int main() {
while(gets(num) && num[0]!='-') {
memset(flag,0,sizeof(flag));
int len = strlen (num);
for(int i=0; i<len; i++) {
int x=num[i]-'0';
flag[x]++;
}
int cnt1=0,cnt2=0;
for(int i=0; i<10; i++) {
if(flag[i]>0 && flag[i]%2==0)
cnt2++;
else if(flag[i]>0 && flag[i]%2!=0)
cnt1++;
}
if(cnt1>=2)
{
printf("No\n");
continue;
}
else
if(cnt1==1 && flag[0]%2==0 && cnt2==1 && flag[0]!=0)
printf("No\n");
else
printf("Yes\n");
}
}