题目链接:http://lx.lanqiao.org/problem.page?
gpid=T113
历届试题 回文数字
时间限制:1.0s 内存限制:256.0MB
问题描写叙述
观察数字:12321,123321 都有一个共同的特征,不管从左到右读还是从右向左读,都是同样的。这种数字叫做:回文数字。
本题要求你找到一些5位或6位的十进制数字。满足例如以下要求:
该数字的各个数位之和等于输入的整数。
本题要求你找到一些5位或6位的十进制数字。满足例如以下要求:
该数字的各个数位之和等于输入的整数。
输入格式
一个正整数 n (10<n<100), 表示要求满足的数位和。
输出格式
若干行,每行包括一个满足要求的5位或6位整数。
数字按从小到大的顺序排列。
假设没有满足条件的,输出:-1
数字按从小到大的顺序排列。
假设没有满足条件的,输出:-1
例子输入
44
例子输出
99899
499994
589985
598895
679976
688886
697796
769967
778877
787787
796697
859958
868868
877778
886688
895598
949949
958859
967769
976679
985589
994499
499994
589985
598895
679976
688886
697796
769967
778877
787787
796697
859958
868868
877778
886688
895598
949949
958859
967769
976679
985589
994499
例子输入
60
例子输出
-1
题解:自己定义一个类。用来保存回文数以及各个位数之和。
然后按从小到大的顺序直接构造。最后直接查找就可以
AC代码:
#include<iostream> #include<string> #define N 1000000 using namespace std; int pos=0,n; class Node{ public: int sum; string num; void Calc(int k,int flag){ string str="",tmp=""; while(k) { str+='0'+k%10; k/=10; } tmp+=str[2]; tmp+=str[1]; if(flag){ str=tmp+str; } else str=tmp+str[0]+str; num=str; } void CalcBit(){ string s=num; int total=0,len=s.size(); for(int i=0;i<len;i++) total+=s[i]-'0'; sum=total; } }x[N]; void init(){ for(int i=100;i<1000;i++){ x[pos].Calc(i,1); x[pos++].CalcBit(); } for(int i=100;i<1000;i++){ x[pos].Calc(i,0); x[pos++].CalcBit(); } } int main() { init(); cin.sync_with_stdio(false); cin>>n; int flag=1; for(int i=0;i<pos;i++) if(x[i].sum==n)cout<<x[i].num<<endl,flag=0; if(flag)cout<<-1<<endl; return 0; }
<span style="color: rgb(51, 51, 51); font-family: 宋体, 'Times New Roman';font-size:18px; line-height: 18.5714302062988px;">出处:</span><a target=_blank href="http://blog.csdn.net/mummyding" style="font-family: 宋体, 'Times New Roman';font-size:18px; line-height: 18.5714302062988px;">http://blog.csdn.net/mummyding</a><span style="color: rgb(51, 51, 51); font-family: 宋体, 'Times New Roman';font-size:18px; line-height: 18.5714302062988px;"> </span>
作者:MummyDing
f