(过了这个题灰常灰常开心)
好像前两道忘记了传送门:
洛谷算法标签:
其实还有高精度
这个题困死在了十六进制,后来想了想,我们在c[i]中存入一个大于十的数之前的程序也可以实现回文(11=11嘛),所以加了个n=16时的特判:
利用强制类型转化把ABCDEF转化成10,11,12,13,14,15接着进行程序。
int tp() { for(int i=0;i<=len-1;i++) { if(m[i]>=65){int e=m[i]-55;a[len-i]=e;} else a[len-i]=m[i]-48; } for(int i=0;i<=len-1;i++) { if(m[i]>=65){int e=m[i]-55;a[len-i]=e;} else b[i+1]=m[i]-48; } if(hw1(len)) cout<<0<<endl; else sum(len); }
好的附ac代码:
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> using namespace std; char m[100001]; bool hw1(int); int n,len; int a[10000001],b[10000001],c[10000001]; int g=0; bool hw(int f) { int i=1,j=f; bool flag=1; while(i<=j) { if(c[i]!=c[j]){flag=0;break;} else{i++;j--;} } return flag; } int sum(int len) { int j=1; int x=0; while(len>=j) { c[j]=a[j]+b[j]+x; x=c[j]/n; c[j]%=n; j++; } c[j]=x; while(c[j]==0&&j>1)j--; for(int i=1;i<=j;i++) { a[i]=c[i]; b[i]=c[j-i+1]; } g++; if(g>=30)cout<<"Impossible"<<endl; else { if(hw(j))cout<<g<<endl; if(!hw(j))sum(j); } } int tp() { for(int i=0;i<=len-1;i++) { if(m[i]>=65){int e=m[i]-55;a[len-i]=e;} else a[len-i]=m[i]-48; } for(int i=0;i<=len-1;i++) { if(m[i]>=65){int e=m[i]-55;a[len-i]=e;} else b[i+1]=m[i]-48; } if(hw1(len)) cout<<0<<endl; else sum(len); } int main() { cin>>n; scanf("%s",m); len=strlen(m); if(n==16)tp(); else{ for(int i=0;i<=len-1;i++)a[len-i]=m[i]-48; for(int i=0;i<=len-1;i++)b[i+1]=m[i]-48; if(hw1(len)) cout<<0<<endl; else sum(len); } } bool hw1(int f) { int i=1,j=f; bool flag=1; while(i<=j) { if(a[i]!=a[j]) { flag=0; break; } else{i++;j--;} } return flag; }
码风清奇
end-
【洛谷p1015】【一本通p1309】回文数(noip1999)
原文:https://www.cnblogs.com/zhuier-xquan/p/10466452.html