UVa:12050 Palindrome Numbers

来源:互联网 发布:网络法律咨询 编辑:程序博客网 时间:2024/05/21 10:47

区间分解的问题。想想回文数是怎么构造出来的就行。

1——9,长度是9个1

11——99,长度是9个1

101——999,长度是9个10

1001——9999,长度是9个10

……

可见每次都是9个9个的,它的单位分别是1,10,100……这样。由于回文数长度可能是奇或偶,所以有两种情况。这样分解区间,然后求解就行了。

#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <algorithm>#define ll long long#define Lim 2000000000using namespace std;struct Segment{    ll g,L,R;    int v;    Segment(ll a,ll b,ll c,int d):g(a),L(b),R(c),v(d) {}};vector<Segment> vec;void Init(){    ll sum=0,g=1;    while(sum<=Lim)    {        vec.push_back((Segment(g,sum+1,sum+9*g,1)));        sum=sum+9*g;        vec.push_back((Segment(g,sum+1,sum+9*g,2)));        sum=sum+9*g;        g=g*10;    }}int Search(ll val){    for(int i=0; i<vec.size(); ++i)        if(vec[i].L<=val&&val<=vec[i].R)            return i;}void solve(ll val,char *str){    int u=Search(val);    ll key=val-vec[u].L+vec[u].g;    memset(str,0,sizeof(str));    sprintf(str,"%lld",key);    if(vec[u].v==1)    {        for(int i=strlen(str)-2,q=strlen(str);i>=0;--i,++q)            str[q]=str[i];    }    else    {        for(int i=strlen(str)-1,q=strlen(str);i>=0;--i,++q)            str[q]=str[i];    }}int main(){    ll val;    Init();    while(scanf("%lld",&val)&&val)    {        char str[100]={0};        solve(val,str);        puts(str);    }    return 0;}


 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 八十岁老人得了膀胱癌怎么办 肾结石引起吐血尿血怎么办 肾结石引起的尿血怎么办 食道感觉有异物怎么办 膀胱出血有血块怎么办 肾小球滤过率20怎么办 膀胱癌术后有血尿怎么办 肾病贫血怎么办吃什么 低蛋白血症怎么办 慢性肾炎患者感冒了怎么办 透析病人磷高怎么办 尿毒症透析磷高怎么办 怀孕了有膀胱炎怎么办 宝宝拉肚子尿少怎么办 猫尿血怎么办吃什么药 肝癌小便不出来怎么办 怀孕三个月结石血尿怎么办? 肾小球滤过率65怎么办 肾穿后有血肿6cm怎么办 肾穿刺后血肿怎么办 手术后有血肿怎么办 尿蛋白胆红素高怎么办 哺乳期尿蛋白高怎么办 产后老放屁便秘怎么办 肝癌移植后复发怎么办 产后屁多便秘怎么办 肝癌切除后复发怎么办 宝宝便秘拉不出大便怎么办 宝宝便秘屁多怎么办 尿液浑浊气味重怎么办 经常便秘肚子胀怎么办 顺产满月后腰疼怎么办 化验尿蛋白质高怎么办 小孩子反复蛋白尿怎么办呢? 肾上张了个囊肿怎么办 同床后出血怎么办 药物引起胃不适怎么办 感冒引起的便秘怎么办 月经期失血过多怎么办 肾结石尿血好痛怎么办 小孩高烧39.6度怎么办