LA2889

这里我想要说下对于公式的理解。其实这个公式是根据排列组合算出来的

k位数字组成的回文数个数为       f(k)=9*10^((k-1)/2)

为什么会有这个公式呢:因为我们在最高位的时候对于回文数只有9种可能选(0不能选嘛)。那么最低位同时也不能为0(回文嘛)那么剩下k-2位,对于其他位的数我就有每位10种选择。由于是回文那么我只要算到其他的k-2的一半就可一了。。由于此处最高位已经拿出来算来 所以我就只用10^(k-1)/2就可以了。

然后呢我们只要取在当前这个长度下的第几位就可以来。按照前面理论 对于当前长度的回文串我们是从1000…0001开始的 所以我们只要加上其第几位就是当前长度了。

这里还有一点需要注意的就是奇偶判断。因为如果是奇数的情况中间那个数只出现一次。这里可以引用一个小技巧

就是长度直接-1再除2 那么我就可以不用考虑奇偶性了。还有一个就是 我担心这个题目会超过int  由于在某些编译器下pow的返回是float(摘自百度百科:在TC2.0中原型为extern float pow(float x, float y); ,而在VC6.0中原型为double pow( double x, double y );) 所以我担心就自己写了个pow 因为最长也就10^9所以累加起来不会超过10^20用long long 是可以的。

然后依次回文就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值