#1999#回文数

似乎不用string写反而更简单...研究了好久字符串的方法,似乎有很多没学过的东西

高精度加法+回文数判断,注意处理16进制

千万不要试着输出处理过后的M1,是一堆奇怪的码..不过只要判断是否相同就好了。

最后卡在了单双引号上...直接输出要用双引号...c++的鬼畜..

#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;

int n;
string M1;

void Add(string a,string b){
     int len=a.size();
     int j=0;
     int c[200]={0};
     for(int i=len-1;i>=0;--i){
       c[j]+=a[i]+b[i];
       c[j+1]+=c[j]/n;
       c[j]=c[j]%n;
       j++;
     }
     if(c[len]>0)//进位判断 放在迁移数组之前 
       len++;
     M1="";
     for(int i=0;i<len;i++)
       M1+=c[i];//字符串内+int型,get新技能!
}

bool Judge(string a){
    int len=a.size();
    for(int i=0;i<len/2;i++)
       if(a[i]!=a[len-i-1])
          return false;
    return true;
}  

int main(){
     cin>>n>>M1;
     int k=M1.size(); 
     int i=0;
     
    for(int j=0;j<k;j++)
     {
       if(isdigit(M1[j]))//判断是否为数字
          M1[j]=M1[j]-'0';
       if(islower(M1[j]))//判断是否为小写字母
          M1[j]=M1[j]-'a'+10;
        if(isupper(M1[j]))//判断是否为大写字母
          M1[j]=M1[j]-'A'+10;
     }
     if(Judge(M1)){
       cout<<"STEP=0"<<endl;
       return 0;
     }
     else 
        i++;
     for(;i<=30;i++)
     {
       string M2=M1;
       reverse(M2.begin(),M2.end());//将字符串倒置
       Add(M1,M2);
       if(Judge(M1)){
          cout<<"STEP="<<i<<endl;
          return 0;
       }
     }
     cout<<"Impossible!"<<endl;
     system("pause");
     return 0;   
     
}

 

posted on 2018-02-21 14:12  yiga  阅读(134)  评论(0)    收藏  举报

导航