栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

该数字的位数是偶数
该数字是一个回文数
例如: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
#include 
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< 

1.此题实现时需要对计算机中数字计算熟练掌握,如求数字位数,根据数字位数倒转数字进行相加,需要良好的基本功。

2.另外在处理此种数字问题时切忌盲目遍历暴力解决,否则会费时费力,提交时会时间超限,徒增麻烦。所以需要摒弃惯性思维,跳出平常思维,用不同的角度看待问题,解决问题。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/510618.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号