1999 NOIP 回文数

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 }
原文地址:https://www.cnblogs.com/OIerPrime/p/7674646.html