题解
2024-02-13 17:47:19
发布于:湖南
87阅读
0回复
0点赞
简单的高精度,但是是我集训时的噩梦(doge)
注意:在循环的最后一定要清空数组c!!!不然你会得到:
5+1=1
1+7=9
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char A[105];
short a[100005], b[100005], c[100005];//怕re,数组开大点怎么了(
bool check(short *a){//检查是否回文
for(int i = 1; i <= a[0] / 2; i++){
if(a[i] != a[a[0] - i + 1]) return 0;//如果前后两个不一样,就不是回文
}return 1;
}
int main(){
int n;
cin >> n;
cin >> A;
a[0] = strlen(A);
for(int i = 1; i <= a[0]; i++){
a[i] = A[i - 1] - '0';//因为不考虑顺序,所以可以不用倒着录入
if(A[i - 1] >= 'A'){
a[i] = A[i - 1] - 'A' + 10;
}
}int t = 30;
while(t){
if(check(a)){
cout << "STEP=" << 30 - t;//如果是回文数,直接输出
return 0;
}
for(int i = 1; i <= a[0]; i++){
b[i] = a[a[0] - i + 1];//将b数组变成a数组向左读
c[i] = 0;//同时清空c数组,没这一步的话……
}
for(int i = 1; i <= a[0]; i++){
c[i] += a[i] + b[i];//注意是+=而不是=,因为要考虑进位
c[i + 1] = c[i] / n;//进位
c[i] %= n;
}
if(c[a[0] + 1]) a[0]++;//如果数位多了1,要把数组长度+1
for(int i = 1; i <= a[0]; i++){
a[i] = c[i];//复制回a数组
}
t--;//注意!!!最后自减
}cout << "Impossible!";//否则就“不可能”做到,输出Impo后面忘了(
return 0;
}
全部评论 1
我竟然没看懂
2024-07-23 来自 广东
0
有帮助,赞一个