• 洛谷 U3348 A2-回文数


    题目背景

    方方方很喜欢回文数,于是就有了一道关于回文数的题目。

    题目描述

    求从小到大第n(1<=n<=10^18)个回文数。

    注释:出题人认为回文数不包括0。

    输入输出格式

    输入格式:

    一行一个正整数n。

    输出格式:

    第n个回文数。

    输入输出样例

    输入样例#1:
    2333
    输出样例#1:
    1334331
    输入样例#2:
    12345678987654321
    输出样例#2:
    23456789876543222234567898765432

    说明

    对于50%的数据,n<=3000。

    对于100%的数据,1<=n<=10^18。..

    打表找规律 

    1 2 3 4 5 6位的回文个数分别是 9 9 90 90 900 900...

    规律很明显了。

    一个回文数 123456654321 左右是一样的

    所以只求一半就可以了 然后拼接起来

    屠龙宝刀点击就送

    #include <cstring>
    #include <cstdio>
    typedef long long LL;
    struct node
    {
        int a[50],len;
        node()
        {
            memset(a,0,sizeof(a));len=0;
        }
    }Ret,RetS;
    node findhws(LL n)
    {
        LL ret,cnt=0,w=0,num=9,half=1;
        for(;1;)
        {
            if(w>0&&w%2==0) num*=10;
            w++;
            if(cnt+num>=n) break;
            cnt+=num;
        }
        n=n-cnt-1;
        for(int i=1;i<=w-1>>1;++i) half*=10;//赵基数
        half+=n;
        ret=half;
        if(w%2==1) half/=10;
        for(;ret;ret/=10) Ret.a[++Ret.len]=ret%10;
        RetS=Ret;
        for(int i=1;i<=RetS.len;++i) Ret.a[RetS.len-i+1]=RetS.a[i];
        for(;half;half/=10) Ret.a[++Ret.len]=half%10;
        return Ret;
    }
    LL n,len;
    int main()
    {
        scanf("%lld",&n);
        node ans=findhws(n);
        for(int i=1;i<=ans.len;++i) printf("%d",ans.a[i]);
        return 0;
    }
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    Docker 文档编译
    Docker CentOS 安装方法
    Docker CentOS 安装要求
    Docsify 的文档页面标题在那里设置
    Docsify 的 GitHub 链接在那里设置的
    GitHub 中如何启用 GitHub Pages 中的子域名
    Spring API 的 CORS 测试 提示错误 Reason: header ‘authorization’ is not allowed
    Spring API 的 CORS 测试
    CentOS 7 安装 JDK 11
    Postman API 获得文件如何保存
  • 原文地址:https://www.cnblogs.com/ruojisun/p/7527693.html
Copyright © 2020-2023  润新知