一个简单的判断准回文数和回文数的代码,自己电脑上通过了,oj一直通不过

问题描述:

设准回文数是这样一个数,在它上面加上一些前导零(可能没有)就产生了一个回文字符串。

字符串t称为回文,如果它从左到右和从右到左读取相同的内容。

例如,数字131和2010200是准回文的,它们可以分别转换为字符串“131”和“002010200”,这是回文。

给你一些整数x。检查它是否是一个准回文数。

 

输入:

第一行包含一个整数x(1 ≤ x ≤ 109)。这个数字没有任何前导零。

输出:

如果数字x是准回文的,则打印“是”。否则,打印“否”(不带引号)。

举例:

输入:

131

输出

YES

输入

320

输出

NO

输入

2010200

输出

YES

 

我的代码

#include<iostream>
#include<cmath>
using namespace std;
double t;
int n;
int k,p,s,p2,w1,w2;
int m=0;
int main(){
	int count=0;              //用来判断几位数
	cin>>t;        //输入数
	if((int)t!=t) cout<<"NO"<<endl;      //判断是否为整数,若是小数就返回NO
	else if((int)t==t){
		n=(int)t;                    //是整数
	if(n<1) cout << "NO"<<endl;      //题目要求输入的数大于1,
	if(n>=1){
			s=n;
			w1=n;
			while(s/10){
				count++;
				k=s%10;
				s/=10;
			}
			count++;
			k=s%10;
			if(count==1) {
				cout << "NO"<<endl;
			}
			else if(count!=1){
				for(int i=count;i>0;i--){
					p+=n%10*(int)pow((float)10,(int)i-1);
					n/=10;
				}
				count=0;
				if(p==w1) cout << "YES"<<endl;  //w1等于输入的数,p是去掉后面尾巴上0的逆序数
				if(p!=w1){    //判断是否为准回文数
					s=p;
					w2=p;
					while(s/10){
						count++;
						k=s%10;
						s/=10;
					}
					count++;
					k=s%10;
					for(int i=count;i>0;i--){
						p2+=p%10*(int)pow((float)10,(int)i-1);
						p/=10;
					}
					if(p2==w2) cout << "YES"<<endl;      //是准回文数
					else if(p2!=w2) cout << "NO"<<endl;    //不是准回文数
				}
			}
	}
}
	return 0;
}

然后题目给的例子我都测试通过了,小数,负数,个位数都考虑到了,不知道为什么oj上就说wrong answer。求大佬帮忙看看

其实不用考虑小数和负数。。。因为题目中保证x为证书,并且1≤x≤109

整数

 

应该是部分正确吧。目前只看出了第25行if里输出错了,因为一位数肯定是回文数。献上两种方法吧:

先分析一下题目:加前导零,只在结尾有0的时候才能起作用,所以末尾0可以去掉。然后直接判断回文就可以了。

法1:用字符串 

#include <bits/stdc++.h>
using namespace std;
bool judge(string s) {	// 判断字符串是否为回文 
	for (int i = 0, j = s.size() - 1; i < j; ++i, --j) {
		if (s[i] != s[j]) {
			return false;
		}
	}
	return true;
}
int main() {
	string s; cin >> s;
	int pos;
	for (int i = s.size() - 1; i >= 0; --i) {	// 找到从末尾开始第一个不是0的位置 
		if (s[i] != '0') {
			pos = i; break;
		}
	}
	if (judge(s.substr(0, pos + 1))) { // pos - 0 + 1 = pos + 1 
		cout << "YES\n";
	} else {
		cout << "NO\n";
	}
	return 0;
}

法儿:用数

#include <bits/stdc++.h>
using namespace std;
bool judge(int n) { // 判断数是否回文 
	int tmp = n, sum = 0;
	while (tmp) {
		sum = sum * 10 + tmp % 10; tmp /= 10;
	}
	return sum == n;
}
int main() {
	int n; cin >> n;
	while (n % 10 == 0) {	// 去掉末尾0 
		n /= 10;
	}
	if (judge(n)) {
		cout << "YES\n";
	} else {
		cout << "NO\n";
	}
	return 0;
}