7-5回文数文回

7-5 回文数文回

分数 300

我们称一个数是回文的,当且仅当它正着读和倒着读是相同的。

例如11或11455411是回文的,而10或1919810不是回文的。

现在给定一个数n,你需要求出区间[108,n]中所有的回文数。

输入格式:

一行一个整数n(108≤n<109)

输出格式:

输出一行一个数,表示题目所求区间中回文数的数量。

输入样例:

在这里给出一组输入。例如:

100000001

输出样例:

在这里给出相应的输出。例如:

1

代码长度限制

16 KB

时间限制

500 ms

内存限制

64 MB

        判断一个数是不是回文数是简单的,但是如果这么多数一个一个判断,你不超时谁超时??那怎么办呢?纯数学的办法我不会,但是我有一个办法,就是100000001是第一个回文数,那么就找在他后面第一个最小的回文数。怎么找呢?在中间加1,中间如果是9了,就清零,往两边加。直到加到比判断的上界大。

        我习惯用字符串处理比较大的数这类问题,但是如果已经是全9的时候,按照这种办法再加就是全0了,那么就没法比上界大了。这个时候就要做特殊处理了,但是特殊情况也就这一种,当时我就是因为卡到这里就剩5分钟了,然后这题就没有过。

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
//回文数的大小能不能用字符串比大小的方法来比较呢
//能的
//八位的回文数
void nexthui(string &num)
{
  //half是中间的下标,bo是波动的下标
  int half = num.length()/2, bo = 0;
  while(bo <= half && num[half+bo] == '9' && num[half-bo] == '9')
  {
    num[half+bo] = '0', num[half-bo] = '0';
    bo++;
  }
  if(bo)
  {
    num[half+bo]++, num[half-bo]++;
  }
  else
  {
    num[half]++;
  }
  return;
} 
//函数返回下一个最小的回文数
//前提要给一个回文数
int main()
{
  string num;
  int cnt = 0;
  cin >> num;
  if(num < "100000001")
  {
    cout << cnt << endl;
    return 0;
  }
  else
  {
    string i = "100000001";
    do
    {
      nexthui(i);
      cnt ++;
    } while (i <= num && i != "999999999");
    if(num == "999999999")
        cout << cnt+1 << endl;
    else
        cout << cnt << endl;
  }
  return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值