NOJ 1046 第K回文数 水题
2016-07-29 22:45
567 查看
第K回文数
时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte总提交 : 844 测试通过 : 233
比赛描述
回文数是这样一个正整数:它从左往右读和从右往左读是一样的。例如1,111,121,505都是回文数。将1到100,000,000内所有回文数按从小到达排序后,第k个回文数是多少呢?
输入
第一行为一个整数N,表示询问的次数。以下N行每行一个整数k,表示询问第k个回文数是多少。
输出
输出共N行,按照输入数据的顺序,依次输出第k<
c01a
/span>个回文数。
样例输入
2
5
10
样例输出
5
11
题目来源
NUAA
题意:给出数字k,需要打印出第k个回文数。
分析:很容易找出规律,决定一个回文数的是它的前半个部分,1位回文数和2位回文数个数是相等的,三位和四位也是相等的……以k等于199为例,它是五位回文数的第一个,它的前半部分就是100,即99+1,后面的第n个五位回文数就是99+n。这样很容易找出规律,用数组记录即可。
见AC代码:
#include<stdio.h> //找规律 #include<iostream> #include<stack> using namespace std; int a[10]= {0,9, 9,90,90,900,900,9000,9000,90000}; int b[10]= {0,0,0,9,9,99,99,999,999,9999}; int main() { int T; scanf("%d",&T); while(T--) { int n,num; scanf("%d",&n); for(int i=0; i<10; i++) //找到它是几位的回文数 if(n>a[i]) n-=a[i]; else { num=i; break; } int front=n+b[num]; //构成回文数的前半部分 int f1,f2; f1=front; f2=front; string s; stack<int> a; while(front) //整数转字符串 { a.push(front%10); front/=10; } while(!a.empty()) { s+=a.top()+'0'; a.pop(); } if(num%2==0) //偶数位的回文数 前后一样 { while(f1) { s+=f1%10+'0'; f1/=10; } cout<<s<<endl; } else //奇数位的回文数 中间数不重复打印 { f2/=10; while(f2) { s+=f2%10+'0'; f2/=10; } cout<<s<<endl; } } }深夜刷水题,找找手感。感觉水平还是有所提高的,唯有努力。
特记下,以备后日回顾。
相关文章推荐
- noj 1046 第K回文数
- 1046-第K回文数
- HDOJ 1046 水题
- NOJ--1046--dfs
- NOJ1088Gnome Sequencing——水题
- [问题 1434: \[蓝桥杯\]\[历届试题\]回文数字](水题)
- HDU1318 POJ1590 UVA401 ZOJ1325 Palindromes【回文+水题】
- NOJ [1046]整数划分
- NOJ 1573 水题
- HDU 1431--素数回文【水题】
- POJ 1046 Color Me Less(水题)
- NOJ1046第K回文数——???
- HDU——1046 Gridland(水题+规律题)
- hdu 水题十道(2) 1210 1065 1249 1273 1290 1046 1049[Unfinished]
- Color Me Less (poj 1046) (sdut 1047)水题
- 第K大素数(水题)
- UVA10018 Reverse and Add【回文数+水题】
- CodeForces 688B Lovely Palindromes (水题回文)
- NOJ 1798 并查集水题
- NOJ-1163-素数回文