试题 算法训练 回文数
题目描述:
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。
又如:对于10进制数87:
STEP1:87+78 = 165 STEP2:165+561 = 726
STEP3:726+627 = 1353 STEP4:1353+3531 = 4884
在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
写一个程序,给定一个N(2<=N<=10或N=16)进制数M(其中16进制数字为0-9与A-F),求最少经过几步可以得到回文数。
如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
输入格式
两行,N与M
输出格式
如果能在30步以内得到回文数,输出“STEP=xx”(不含引号),其中xx是步数;否则输出一行”Impossible!”(不含引号)
样例输入
9
87
样例输出
STEP=6
注意:
中间加法计算过程需将字符数组转化为普通int型数组(这么做方便计算)。
AC代码:
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
int m;
int main()//比如:87+78 = 165 165+561 = 726 726+627 = 1353 1353+3531 = 4884
{
int m;//n为数
char a[100];//a字符数组存储一个m进制的数字
cin>>m>>a;
int i,j,k=strlen(a);
int temp;
int Flag=0;
for(i=0;i<30;i++)//循环次数
{
int flag=0;
for(j=0;j<k/2;j++)
if(a[j]!=a[k-j-1])
{
flag=1;//不是回文数
break;
}
if(!flag)//是回文数
{
cout<<"STEP="<<i<<endl;
Flag=1;//是否可以在30步内计算出来
break;
}
else//不是回文数 ,继续操作
{
int aa[100],mm;
//将a数组字符转化为int型数字,然后存储到数组aa中(这么做是为了方便后续加法计算)
for(j=0;j<k;j++)
{
if(a[j]>='0'&&a[j]<='9')
mm=(int)(a[j]-'0');
else
mm=(int)(a[j]-'A'+10);
aa[j]=mm;
}
int bb[100],sumsum[100]; //bb存储逆序的aa数组数据,sumsum存储aa数组与bb数组的和
int t=0;
for(j=k-1;j>=0;j--)//将数组aa逆序存储在bb数组中 (其中t==k)
bb[t++]=aa[j];
int r=0,kk=0;//kk为sumsum数组的长度
int temp;
for(j=k-1;j>=0;j--)//加法计算(从最后一位逆序向前计算)
{
temp=aa[j]+bb[j]+r;
sumsum[kk++]=temp%m;
r=temp/m;
}
while(r)
{
sumsum[kk++]=r%m;
r/=m;
}
int lenSum=0;//lenSum==kk
char sum[100];
char ch;
for(j=kk-1;j>=0;j--)//将sumsum数组数据转化为字符存储在sum中
{
if(sumsum[j]>=0&&sumsum[j]<=9)
ch=(char)(sumsum[j]+'0');
else
ch=(char)('A'+sumsum[j]-10);
sum[lenSum++]=ch;
}
k=0;
for(j=0;j<kk;j++)//将数组sum内容拷贝给数组a
a[k++]=sum[j];
}
}
if(!Flag)
cout<<"Impossible!"<<endl;
return 0;
}
来源:CSDN
作者:zhe个芦苇
链接:https://blog.csdn.net/qiaoermeng/article/details/104573030