蓝桥杯 - 回文数目字 (字符串!)

蓝桥杯 - 回文数字 (字符串!!)

回文数字  
时间限制:1.0s   内存限制:256.0MB
    
问题描述
  观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。

  本题要求你找到一些5位或6位的十进制数字。满足如下要求:
  该数字的各个数位之和等于输入的整数。
输入格式
  一个正整数 n (10<n<100), 表示要求满足的数位和。
输出格式
  若干行,每行包含一个满足要求的5位或6位整数。
  数字按从小到大的顺序排列。
  如果没有满足条件的,输出:-1
样例输入
44
样例输出
99899
499994
589985
598895
679976
688886
697796
769967
778877
787787
796697
859958
868868
877778
886688
895598
949949
958859
967769
976679
985589
994499
样例输入
60
样例输出
-1


思路:先把回文的序列的表打好,算出来正好就1800,所以我数组开的2000

然后从前到后扫一遍即可,满足条件就输出。。


AC代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 2000;
int palin[maxn], num = 0;

int is_palin(int n)    //判断是否是回文数 
{
	if(n<100000)
	{
		if( (n/10000 == n%10) && (n/1000%10 == n/10%10) )
			return 1;
	}
	else
	{
		if((n/100000 == n%10) && (n/10000%10 == n/10%10) && (n/1000%10 == n/100%10))
			return 1;
	}
	return 0;
}

void init()     //回文数打表 
{
	for(int i=10000; i<=999999; i++)
	{
		if(is_palin(i)) palin[num++] = i;
	} 
}

int fun(int n)     //判断是否符合条件 
{
	int t = 0, m = n;
	while(m)
	{
		t += m%10;
		m /= 10;
	}
	return t;
}

int main()
{
	init();
	int n;
	while(scanf("%d", &n) != EOF)
	{
		if(n < 5 || n>54) { printf("-1\n"); continue; }
		for(int i=0; i<num; i++)
		{
			if(fun(palin[i]) == n) printf("%d\n", palin[i]);
		}
	}
	return 0;
}