题解 P1015 【回文数】

顾z

2018-07-23 20:08:52

Solution

【算法分析】: n进制运算; 1.当前位规范由%10改为%n 2.进位处理由/10改为/n 3.其他运算规则不变 【个人掉坑】: Impossible后面有感叹号:“!” 倒叙再加正序 —————## 出处:《信息学奥赛一本通》## ------------ ```cpp #include<bits/stdc++.h> #define inf 2147483647 #define IL inline #define RI register int using namespace std; int n,len; int num[102],b[103],step; char s[103]; IL void read(int &x){ int f=1;x=0;char s=getchar(); while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();} while(s<='9'&&s>='0'){x=x*10+s-'0';s=getchar();} x*=f; } IL void print(int x){ if(x<0){ putchar('-'); x=-x; } if(x>9) print(x/10); putchar(x%10+'0'); } IL bool check(int num[]) { for(RI i=1;i<=num[0];i++) if(num[i]!=num[num[0]-i+1])return false; return true; } IL void pluss(int num[]) { for(RI i=1;i<=num[0];i++)b[i]=num[num[0]-i+1]; for(RI i=1;i<=num[0];i++)num[i]+=b[i]; for(RI i=1;i<=num[0];i++) { num[i+1]+=num[i]/n; num[i]%=n; } if(num[num[0]+1]>0)num[0]++; } int main() { read(n); cin>>s; num[0]=strlen(s); for(RI i=1;i<=num[0];i++) if(s[num[0]-i]<='9'&&s[num[0]-i]>='0')num[i]=s[num[0]-i]-'0'; else num[i]=s[num[0]-i]-'A'+10; if(check(num)){printf("STEP=%d",step);exit(0);} while(step<=30) { step++; pluss(num); if(check(num)){printf("STEP=%d",step);exit(0);} } printf("Impossible!"); } ```