52wyd @ 2022-12-07 10:45:33
#include <stdio.h>
#include <string.h>
int k, bushu, len;
char str[10000], cp[10000];//cp储存原来的数的反转数
void change();//把这个数与它的反转数相加
int judge(); //判断是否是回文数
int main(void)
{
scanf("%d%s", &k, str);//读入进制k和高精数str
len = strlen(str);//计算高精数的位数
if (judge())//开始即为回文数
{
printf("STEP=0");
return 0;
}
for (bushu = 0; ; bushu ++)//bushu步数
{
if (bushu == 30)
{
printf("Impossible!");
return 0;
}
change(); //改变高精数str
if (judge()) //判断改变后的str是否为回文数
{
printf("STEP=%d", bushu + 1);
return 0;
}
}
}
void change()
{
int i, j, m, si, s, c;
for (i = len - 1, j = 0; i >= 0; i --, j ++)//cp储存原来的数的反转数
cp[j] = str[i];
m = 0;
for (i = 0; i <= len - 1; i ++)//高精加运算
{
if (str[i] <= '9')//把str、cp中的某一位用int类型储存
s = str[i] - '0';
else
s = 10 + (str[i] - 'A');
if (cp[i] <= '9')
c = cp[i] - '0';
else
c = 10 + (cp[i] - 'A');
m += s + c; //开始高精加计算
si = m % k;
if (si <= 10)
str[i] = '0' + si;
else
str[i] = 'A' + (si - 10);
m = (m - si) / k;
}
if (m != 0)//判断是否需要进位
{
if (m <= 10)
str[len] = '0' + m;
else
str[len] = 'A' + (m - 10);
len ++;
}
}
int judge()
{
for (int i = 0, j = len - 1; i <= j; i ++, j --)
if (str[i] != str[j])
return 0;
return 1;
}
by kdtlfx120813 @ 2022-12-07 12:30:01
哪题?
by ISTP @ 2022-12-07 12:40:01
@liufengxiang 旁边有啊,P1015
by 52wyd @ 2022-12-07 12:40:12
@liufengxiang P1015 [NOIP1999 普及组] 回文数
by ISTP @ 2022-12-07 16:36:11
@52wyd 我哭死,为了 A 掉这题把今天的下载样例次数都用光了......
先放份 AC 代码:
#include <bits/stdc++.h>
using namespace std;
int n, num[200], n1[200], n2[200];
string m;
void str2int();
bool check();
void turn();
int main(){
int cnt = 0;
cin>> n>> m;
str2int();
do{
if(check()) break;
turn();
}while((++cnt)<30);
if(cnt<30) cout<< "STEP="<< cnt;
else cout<< "Impossible!";
return 0;
}
void str2int(){
num[0] = m.size();
for(int i=1; i<=num[0]; i++)
if(m[num[0]-i]>'9') num[i]=m[num[0]-i]-'A'+10;
else num[i]=m[num[0]-i]-'0';
return ;
}
bool check(){
for(int i=1; i<=num[0]/2; i++)
if(num[i] != num[num[0]-i+1]) return 0;
return 1;
}
void turn(){
memset(n1, 0, sizeof n1);
memset(n2, 0, sizeof n2);
for(int i=1;i<=num[0];i++)
n1[i]=num[i], n2[i]=num[num[0]-i+1];
int len = num[0]+1;
memset(num, 0, sizeof num);
num[0] = len;
for(int i=1; i<=num[0]; i++)
num[i+1] += (n1[i]+n2[i]+num[i])/n, num[i] = (n1[i]+n2[i]+num[i])%n;
while(!num[num[0]]&&num[0]>1) num[0]--;
return ;
}
可以先看看,我有空来调你的代码
by ISTP @ 2022-12-07 16:39:37
@52wyd 先说一句,你的那个 change 函数肯定能写得更优美更易懂一些
by 52wyd @ 2022-12-07 16:52:18
@QiMi 你的下载样例还有没,我的下载次数用完了::>_<::
by ISTP @ 2022-12-07 16:58:22
@52wyd 我有两个样例,1和2的。5应该是Impossible
2
10011
16
AC27
输出忘了,你拿我的代码对拍一下好了
by 52wyd @ 2022-12-07 22:30:45
问题已解决
change函数中进位的时候不小心把 if (si <= 9)写成 if (si <= 10)了
by 52wyd @ 2022-12-07 22:31:38
@QiMi 我的代码找到问题了 change函数中进位的时候不小心把 if (si <= 9)写成 if (si <= 10)了
by ISTP @ 2022-12-08 07:08:26
@52wyd az,lz 竟然调到那么晚
调出来了倒也可喜可贺,感觉没帮上忙 2333
(昨晚观猴去了)