1015 回文数
这一道题和之前我们做过的那道 幂次方 很像,都是得用到递归的
首先我们得先说题意
这道题,首先我们输入进制,然后输入这个数,每次将这个数和他的倒序进行相加,如果这个和不是回文数就接着相加,知道这个和是回文数
这道题看似复杂一捋思路就很清晰了
转进制函数 求和函数,求倒序函数,判断回文函数
这就是几个函数,函数来组成这个问题,那么如何去构造函数其实就很简单了
转进制函数:
这个函数其实就是用一个数组将字符串存一下,一定要判断,超出10的数说明是16进制,那么就得对字母进行操作,因为16进制含A~G
判断函数:
这个函数就是将这个数组分成两半进行头尾哨兵一位一位地进行判断,有一位不相等就返回错误,最后返回正确
倒序函数:
这个函数就是再开一个数组将刚才的数组进行循环反着存
相加函数:
这个函数就是将长度l的循环进行每一位相加,记得要做进位判断,之前的/10 %10这里注意进制关系
最后记得每次循环步数增一,然后判断是否大于30,就是最后的解了
--------重新---------
递归,递归,递归
重复,重复,重复
我记得那年集训做的题都比较差不多
还有吧,这个题其实真的没有啥算法
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
int base;//进制
string n;
int ans;//记录步数
int l;//存长度
int q[1000001];//用来存原始数据
int hw[1000001];//回文数
void init()
{//转进制函数
int j=0;
for(int i=n.length()-1;i>=0;i--)
{
if(n[i]>='0'&&n[i]<='9')
q[++j]=n[i]-'0';
else
q[++j]=n[i]-'A'+10;//16进制单独考虑
}
}
bool pd(int q[])
{//判断函数
int ln=l;//复制长度
int i=1,j=ln;//头尾哨兵
while(ln--)
{
if(ln<l/2)
break;//只判断一半
if(q[i]!=q[j])
return false;//逐位进行比较
i++;j--;
}
return true;
}
void turn(int q[])
{//倒序函数
int j=0;
for(int i=l;i>=1;i--)
{
hw[++j]=q[i];
}
}
void add(int q[],int hw[])
{//相加函数
for(int i=1;i<=l;i++)
{
q[i]+=hw[i];
q[i+1]+=q[i]/base;//进位处理
q[i]%=base;
}
if(q[l+1])
l++;
}
int main()
{
cin>>base;
cin>>n;
init();
l=n.length();
while(pd(q)==0)
{
turn(q);
add(q,hw);
ans++;//存步数
if(ans>30) break;//结束
}
if(ans>30) cout<<"Impossible!"<<endl;
else cout<<"STEP="<<ans<<endl;
return 0;
}
1015回文数问题解析
383

被折叠的 条评论
为什么被折叠?



