我们将这样的数字定义为偶位回文数:
该数字的位数是偶数
该数字是一个回文数
例如:1221就是一个偶位回文数,而121和1234都不是偶位回文数,前者不满足数字的位数是偶数,后者不满足回文数。
给定一个正整数n,请你求出从小到大前n个偶位回文数的和是多少?
输入
输入共一行,一个正整数n
输出
输出前n个偶位回文数的和
样例输入 Copy
【样例1】 2 【样例2】 5
样例输出 Copy
【样例1】 33 【样例2】 165
提示
样例1解释:从小到大前两个偶位回文数是11,22,和为33
样例2解释:11+22+33+44+55=165
对于100%的数据,1≤n≤105
思路历程:
若使用for循环从1到一个非常大的数之间写函数直接进行遍历查找偶位回文,则需要进行许多无意义的计算并且花费很多时间。
那么回头去看偶位回文的构成可以发现每个偶位回文由从其在偶位回文数列中的次序构造得出。
如第12个偶位回文是12*100+2*10+1*1=1221;
第61个偶位回文是61*100+1*10+6*1=6116;
那么我们便利用此特点进行突破解题。
因为需要前几个数的和,所以我们先进行回文数的构造。
其中需要用到pow()函数进行数字位数扩大。
为了最后输出不溢出,用long long 类型定义sum保存结果。
#include<iostream>
#include<math.h>
using namespace std;
int main()
{long long int n;
cin>>n;
long long int sum=0;
for(int i=1;i<=n;i++)
{long long number=0;long long p=0;
int k=i;int o=i;
while(k>0)//获得此数字的位数。
{
k=k/10;
number++;//number为此数字位数。
}
p=p+o*pow(10,number);//构造回文数的前半部分。
number--;
for(number;o>0;number--)//将前半部分颠倒,进行加和。
{
p=p+o%10*pow(10,number);
o/=10;
}
sum+=p;
}
cout<<sum;
}
1.此题实现时需要对计算机中数字计算熟练掌握,如求数字位数,根据数字位数倒转数字进行相加,需要良好的基本功。
2.另外在处理此种数字问题时切忌盲目遍历暴力解决,否则会费时费力,提交时会时间超限,徒增麻烦。所以需要摒弃惯性思维,跳出平常思维,用不同的角度看待问题,解决问题。