(优化解决)低时间解决偶位回文

我们将这样的数字定义为偶位回文数:

该数字的位数是偶数
该数字是一个回文数
例如: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.另外在处理此种数字问题时切忌盲目遍历暴力解决,否则会费时费力,提交时会时间超限,徒增麻烦。所以需要摒弃惯性思维,跳出平常思维,用不同的角度看待问题,解决问题。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值