#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; }
浙公网安备 33010602011771号