P1015 回文数 (NOIP1999)
思路:
因为存在不同进制的问题,所以考虑用高精度实现。利用对高精度进位的控制来实现不同进制的加法。然后再利用一个循环调用高精度的函数来解题。
1 # include <cstdio> 2 # include <cstring> 3 # include <algorithm> 4 # include <cstdlib> 5 #include <iostream> 6 using namespace std; 7 char a[10000]; 8 int c[10000],al[10000]={0},n=0,len=0,sum=0,flag=0; 9 int add() 10 { 11 sum++; 12 memset(c,0,sizeof(c)); 13 for(int i=1;i<=len;i++) 14 { 15 c[i]+=al[i]+al[len-i+1]; 16 if(c[i]>=n) 17 { 18 c[i+1]++; 19 c[i]=c[i]%n; 20 } 21 } 22 if(c[len+1]!=0) 23 len++; 24 for(int i=1,j=len;i<=j,j>=i;i++,j--) 25 { 26 if(c[i]!=c[j]) 27 break; 28 if(i==j||j-i==1) 29 flag=1; 30 } 31 for(int i=1;i<=len;i++) 32 al[i]=c[i]; 33 } 34 int main() 35 { 36 cin >> n; 37 cin >> a; 38 for(int i=strlen(a)-1;i>=0;i--) 39 { if(a[i]=='0'||a[i]=='1'||a[i]=='3'||a[i]=='4'||a[i]=='5'||a[i]=='6'||a[i]=='7'||a[i]=='8'||a[i]=='9') 40 al[strlen(a)-i]=a[i]-'0'; 41 if(a[i]=='A'||a[i]=='B'||a[i]=='C'||a[i]=='D'||a[i]=='E'||a[i]=='F') 42 al[strlen(a)-i]=a[i]-'A'+10; 43 } 44 len = strlen(a); 45 for(int j=1;j<=30;j++) 46 { 47 add(); 48 if(flag==1) 49 { 50 cout << "STEP=" << sum << endl; 51 return 0; 52 } 53 } 54 cout << "Impossible!" << endl; 55 return 0; 56 }