判断是否可以在指定步数内以某中进制加法构造出一个回文数 :
需要注意的是:
- 指定步数得到的数可能会很大
- 100位之内的数肯定只能用字符串处理了。
- 本题需要注意特殊的取值N =16。可能乍一想,会认为使用单纯的
int arr[]不行,因为需要存储诸如A,B这样的字符,但其实可以将A,B存储成10,11就可以了。所以还是建议使用int arr处理。【因为使用int型处理会方便进行加减计算。】
下面这版代码存在问题,有一个样例无法通过,下次再继续修改~
#include<string>
#include<iostream>
using namespace std;
const int maxN = 10005;
int N;
string M; //M 的值很大,必须使用string 存储
//判断是否回文
bool is_recu(int arr[],int cnt){
//回文判断
for (int i = 0;i <= cnt/2;i++){
if(arr[i] != arr[cnt-1-i]){ // 因为cnt最后多加了一次,所以这里要 -1
return false;
}
}
return true;
}
int main(){
cin >> N >> M; // 输入进制,输入初始值
int step = 0;
int len;
len = M.length();
int arr_1[maxN] ;//顺序
int arr_2[maxN]; //逆序
for (int i = 0; i< M.length(); i++){
arr_1[i] = M[i] - '0';
arr_2[i] = M[len-1-i] - '0';
}
//cout <<"\n";
while(step <= 30){
if ( is_recu(arr_1,len)){
cout << "STEP="<< step<<"\n"; // 支持对STEP=0的输出
return 0;
}
int sum[maxN] ;
int temp = 0;
for (int i = 0;i< len;i++){
sum[i] = (arr_1[i] + arr_2[i] + temp) % N;
temp = (arr_1[i] + arr_2[i] + temp) / N;
}
if(temp ){
sum[len] = temp;
len++;
}
//重新赋值
for (int i = 0;i < len;i++){
cout << sum[i] ;
arr_1[i] = sum[i]; //顺值
arr_2[i] = sum[len-1-i]; //反值
}
cout <<"\n";
//cout <<"STEP="<<step<<" "<< M <<"\n";
step ++;
}
cout <<"Impossible!";
}
这里给出一个没有bug的代码,如下:
#include <cstdio>
#include <cstring>
const int maxN=303;//一次加法顶多多一位,所以顶多多30位,也就是130位左右。我开大一点,开到300.
int n,a[maxN],l;
char c[maxN],d[maxN];//使用字符串存储 => 其实是可以使用数组存储的
inline void add()
{
for (int i=0;i<l;++i)//下面这个就是为了逆序
d[l-i-1]=c[i];
l+=2;//可能有进位,所以我们干脆在前面先多空个两位
for (int i=0;i<l;++i)
{
c[i]+=d[i];
//下面这种写法较优
if (c[i]>=n) c[i+1]++,c[i]-=n;
}
while (!c[l-1]) --l;//大不了多余的前导0再减回来嘛~~简化思维~~
}
inline bool pd()
{
for (int i=0;i<l;++i)
if (c[i]!=c[l-1-i]) return false;
return true;
}
int main()
{
scanf("%d%s",&n,c);
l=strlen(c);
for (int i=0;i<l;++i)
{
if (c[i]>='0' && c[i]<='9') c[i]-='0'; //这得到的不是int类型吗?但是c被定义成字符类型?
else c[i]=c[i]-'A'+10;
}
for (int i = 0;i<l;i++){
printf("%d",c[i]);
}
int step=0;
while (!pd())
{
++step;
if (step>30) break;
add();
}
if (step<=30) printf("STEP=%d\n",step);
else puts("Impossible!");
return 0;
}
可能会下列代码:
if (c[i]>='0' && c[i]<='9') c[i]-='0'; //这得到的不是int类型吗?但是c被定义成字符类型?
else c[i]=c[i]-'A'+10;
存在疑惑,但实际上我们照下面这么理解就好了:![【洛谷】P1015 [NOIP1999 普及组] 回文数_逆序](https://s2.51cto.com/images/blog/202112/31015718_61cdf2fedbe1947031.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
















