Powered by:AB_IN 局外人
P1015 回文数
从大佬题解搬了一部分思想过来。
其实就是两步:
1.回文判断
2.转换为字符串,做高精加
#include <bits/stdc++.h>
using namespace std;
const int maxn=110;
char six[20]="0123456789ABCDEF";
bool huiwen(string str1)
{
string str2=str1;
reverse(str1.begin(),str1.end());
return str1==str2;
}
string gaojingjia(int k,string str1)
{
///此时为k进制 两个相同位数的数做加法
///tip1:若是10进制,则把k改成10即可
///tip2:若两个位数不同
int num1[maxn]={0},num2[maxn]={0},sum[maxn]={0};
int len=str1.length(),len_sum=1,x=0;
string str2=str1;
reverse(str1.begin(),str1.end());
for(int i=0;i<len;i++){
if(isdigit(str1[i]))
num1[len-i]=str1[i]-'0';//对于十六进制的特判,如果是数字减去 0,即可以变成数字
else
num1[len-i]=str1[i]-'A'+10;//如果不是数字减去 A 再加上 10
if(isdigit(str2[i]))
num2[len-i]=str2[i]-'0';
else
num2[len-i]=str2[i]-'A'+10;
}
while(len>=len_sum){//高精加的过程。其实也可以让两个数组先全加起来,然后判断每一个位子是否超了进制,超了就进1,不超就不管。
//(另一个高精加法的办法写在以后的高精fibs里吧)
sum[len_sum]=num1[len_sum]+num2[len_sum]+x;
x=sum[len_sum]/k;
sum[len_sum]%=k;
len_sum++;
}
sum[len_sum]=x;
while(sum[len_sum]==0)
len_sum--;//将前面0全剪了
string str;
for(int i=len_sum;i>=1;i--)
str+=six[sum[i]];//比较巧妙的点!!,由于不能直接输出结果,故可以定义一个字符串,对应一个const的字符串,数字是几,就变为字符让str加上。
//而且字符串从左往右加
return str;
}
int n;string m;
int main()
{
cin>>n>>m;
for(int i=0;i<=30;i++){
if(huiwen(m)){
printf("STEP=%d\n",i);
return 0;//直接结束程序
}
else
m=gaojingjia(n,m);
}
printf("Impossible!");
return 0;
}
中间tip2,搬来写一下
int len1=str1.length();
int len2=str2.length();
//前面补0,弄成长度相同
if(len1<len2){
for(int i=1;i<=len2-len1;i++)
str1="0"+str1;
}
else{
for(int i=1;i<=len1-len2;i++)
str2="0"+str2;
}
len1=str1.length();
明天更新一下int转string的函数吧。
完结。