• Vijos训练计划 1304回文数


    描述

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

    例如:给定一个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 #include <iostream>
     2 #include <string.h>
     3 #include <math.h>
     4 #include <cstdio>
     5 #include <stdlib.h>
     6 
     7 using namespace std;
     8 
     9 int main()
    10 {
    11     int n;//n进制数
    12     char m[40];
    13     int m_n[40]={0},m_rev[40]={0};
    14     cin>>n>>m;
    15     int l=strlen(m);
    16     for(int i=l-1;i>=0;i--)
    17     {
    18         if(m[i]<='9'&&m[i]>='0')
    19             m_n[i]=m[i]-'0';
    20         else
    21             m_n[i]=m[i]-'A'+10;
    22     }
    23     int flag=1;
    24     for(int i=0;i<=l/2;i++)
    25         if(m_n[i]!=m_n[l-i-1])
    26         {
    27             flag=0;
    28             break;
    29         }
    30     if(flag==1)
    31     {
    32         cout<<"STEP=0"<<endl;
    33         return 0;
    34     }
    35     int step=0;
    36     while(1)
    37     {
    38         for(int i=l-1;i>=0;i--)
    39             m_rev[i]=m_n[l-i-1];
    40         int l0=l;
    41         for(int i=0;i<=l0-1;i++)
    42     {
    43         m_n[i]+=m_rev[i];
    44         while(m_n[i]>=n)
    45         {
    46             m_n[i]-=n;
    47             m_n[i+1]++;
    48             if(i==l-1)
    49                 l++;
    50         }
    51     }
    52         step++;
    53         int flag=1;
    54         for(int i=0;i<=l/2;i++)
    55             if(m_n[i]!=m_n[l-i-1])
    56             {
    57                 flag=0;
    58                 break;
    59             }
    60         if(flag==0&&step>30)
    61         {
    62             cout<<"Impossible!"<<endl;
    63             break;
    64         }
    65         else if(flag==1)
    66         {
    67             printf("STEP=%d
    ",step);
    68             break;
    69         }
    70     }
    71     return 0;
    72 }
    View Code

    因为没加“=”而wa巨多次

    因为impossible的I没有大写而wa

    题是水题 但细心才能对啊...

    注定失败的战争,也要拼尽全力去打赢它; 就算输,也要输得足够漂亮。
  • 相关阅读:
    Mybaits的10种通用的写法
    你清楚这几个Spring常用注解吗?
    面试时如何介绍自己
    Spring加载加密的配置文件
    MySQL主从复制
    CentOS7安装和配置MySQL
    Druid监控页面配置与使用
    Shiro配置URL过滤
    基于注解的Dubbo服务配置
    Java中常用的加密算法小结
  • 原文地址:https://www.cnblogs.com/yalphait/p/8506875.html
Copyright © 2020-2023  润新知