您的位置:首页 > 其它

HDU——5062 Beautiful Palindrome Number

2014-10-12 09:13 302 查看
题意:找出10^0~10^6之间的Beautiful回文个数,Beautiful回文即首先该数是回文,其次右半边是递增,左半边是递减。

思路:将0~10^6之间的Beautiful回文个数找出来打表就ok了。

找出个数打表后的Code:
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
int T,N;
int array[8] = {1,9,18,54,90,174,258};//在找出10的各个次方的Beautiful回文个数后,直接进行打表
scanf("%d",&T);
while(T--)
{
scanf("%d",&N);
printf("%d\n",array
);
}
return 0;
}
找出0~10^6之间的Beautiful回文个数个数:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: