zoukankan      html  css  js  c++  java
  • Vijos 回文数

    描述

    若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。

    例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。

    又如:对于10进制数87:
    STEP1:87+78 = 165 STEP2:165+561 = 726
    STEP3:726+627 = 1353 STEP4:1353+3531 = 4884
    在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。

    写一个程序,给定一个N(2<=N<=10或N=16)进制数M,其中16进制数字为0-9与A-F,求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”

    格式

    输入格式

    共两行
    第一行为进制数N(2<=N<=10或N=16)
    第二行为N进制数M(0<=M<=maxlongint)

    输出格式

    共一行
    第一行为“STEP=”加上经过的步数或“Impossible!”

    样例1

    样例输入1

    9
    87
    

    样例输出1

    STEP=6
    

    限制

    各个测试点1s

    来源

    NOIP1999提高组第2题

     1 /*
     2     先处理进制数 
     3     然后用高精加法来加每一次的数 (因为有16进制 T_T)
     4     然后在判断是不是回文数  
     5 */
     6 #include<iostream>
     7 #include<cstring>
     8 #include<cstdio>
     9 #define MAXN 1010
    10 
    11 using namespace std;
    12 
    13 int a[MAXN],n,step,b[MAXN],c[MAXN];
    14 
    15 char p,s[MAXN];
    16 
    17 inline bool pd() {
    18     if(a[0]%2==0) {
    19         int i=1,j=a[0];
    20         while(i<=j) {
    21             if(a[i]!=a[j]) return false;
    22             i++;j--;
    23         }
    24         return true;
    25     }
    26     else {
    27         int i=1,j=a[0];
    28         while(i!=j) {
    29             if(a[i]!=a[j]) return false;
    30             i++;j--;
    31         }
    32         return true;
    33     }
    34 }
    35 
    36 inline void pluss() {
    37     b[0]=a[0];
    38     for(int i=a[0];i>=1;i--) b[i]=a[a[0]-i+1];
    39     c[0]=++a[0];
    40     for(int i=1;i<=a[0];i++) {
    41         c[i]+=a[i]+b[i];
    42         if(c[i]>=n) {
    43             c[i+1]+=c[i]/n;
    44             c[i]%=n;
    45         }
    46     }
    47     while(c[0]>0&&!c[c[0]]) c[0]--;
    48     for(int i=0;i<=c[0];i++) a[i]=c[i];
    49     for(int i=c[0];i>=0;i--) b[i]=c[i]=0;
    50 }
    51 
    52 int main() {
    53     scanf("%d",&n);
    54     cin>>s;
    55     int len=strlen(s);
    56     for(int i=len-1;i>=0;i--) {
    57         if(s[i]>='0'&&s[i]<='9') a[++a[0]]=s[i]-'0';
    58         else if(s[i]=='A') a[++a[0]]=10;
    59         else if(s[i]=='B') a[++a[0]]=11;
    60         else if(s[i]=='C') a[++a[0]]=12;
    61         else if(s[i]=='D') a[++a[0]]=13;
    62         else if(s[i]=='E') a[++a[0]]=14;
    63         else if(s[i]=='F') a[++a[0]]=15;
    64     }
    65     while(!pd()) {
    66         if(step>30) {
    67             printf("Impossible!
    ");
    68             return 0;
    69         }
    70         pluss();
    71         step++;
    72     }
    73     printf("STEP=%d
    ",step);
    74     return 0;
    75 }
    代码


    作者:乌鸦坐飞机
    出处:http://www.cnblogs.com/whistle13326/
    新的风暴已经出现 怎么能够停止不前 穿越时空 竭尽全力 我会来到你身边 微笑面对危险 梦想成真不会遥远 鼓起勇气 坚定向前 奇迹一定会出现

     
  • 相关阅读:
    获取目录下所有文件名
    毕业论文endnote使用
    CoinChange
    sublime3个人配置
    2015-12-31
    2015-12-09
    #define DEBUG用法
    fiddler介绍
    app测试模块
    android SDK_安装配置_使用
  • 原文地址:https://www.cnblogs.com/whistle13326/p/7103456.html
Copyright © 2011-2022 走看看