hdu 5062
题意:将10^0-10^6之间属于 "Beautiful Palindrome Number" 的数个数打印出来,所谓 "Beautiful Palindrome Number"
是指一中回文串数字,比如123321或者12321,类似于这种的数........
分析:代码我是直接打表出来的,因为T<=7,N<=6,数据不大.....
AC代码:
#include <iostream> using namespace std; int main() { int T,N; int a[8] = {1,9,18,54,90,174,258}; scanf("%d",&T); while(T--) { scanf("%d",&N); printf("%d\n",a[N]); } return 0; }
具体算法这里我贴下另外以为大神写的:
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> using namespace std; const int maxn = 1000000+5; int f[maxn]; int huiwen(int n)//写一个回文函数 { char array[10]; sprintf(array,"%d",n);//将整数N按%d的形式读入字符串中 int len = strlen(array);//求出字符串的长度 int flag = 1;//设置一个标志变量 if(len%2 == 0) { for(int j = 0; j < len/2; j++)//当长度为偶数时,j<len/2 { if(array[0] != array[len-1] && j == 0)//因为该回文数的各个位是递增的,所以要判断每一位与前一位的大小关系,当j=0时,要特判 { flag = 0; break; } if((array[j] != array[len-j-1] || array[j-1] >= array[j]) && j > 0)//当j>0时,要判断每一位与前一位的大小关系和len-j-1位置是否相等 { flag = 0; break; } } } else { for(int j = 0; j <= len/2; j++)//当为奇数时,j <= len/2 { if(array[j] != array[len-j-1] && j == 0) { flag = 0; break; } if((array[j] != array[len-j-1] || array[j-1] >= array[j]) && j > 0) { flag = 0; break; } } } if(flag) return 1; else return 0; } int main() { int T,N; int sum = 0,cas = 0; for(int i = 1; i < 1000001; i++) { sum +=huiwen(i);//sun直接对每个数返回的值进行累加,Beautiful回文越大的,sum自然也越大 if(huiwen(i))printf("%d %d\n",++cas,i);//可以输出每一个Beautiful回文数 f[i] = sum; } scanf("%d",&T); while(T--) { scanf("%d",&N); int temp = pow(10,N); printf("%d",f[temp]);//直接输出 } return 0; }