回文不回文回文
题目:
【问题描述】
若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 10进制数 56,将 56加 65(即把56从右向左读),得到 121是一个回文数。又如,对于10进制数87,
STEPl: 87+78= 165 STEP2: 165+561= 726 STEP3:726+627=1353 STEP4:1353+3531=4884 在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
写一个程序,给定一个N(2<N<=10)进制数 M.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”
【输入样例】
9 87
【输出样例】
6
个人思路:
·1.首先,输入为一个整数N和一个N进制数,可将N进制数以字符串形式来输入,然后将其转化为一维数组进行处理
输出为步数或Impossible,此处可以有判断得数是否为回文数的函数,并且注意步数的上限
·2.中间过程中,每“走一步”都要进行一次N进制的加法,因为不知道中间数或得数会有多大,并且为了N进制的加法,过程选择用高精度加法,可写成函数
还有就是对回文数的判断,可从两边逐渐缩向中间
代码:
1 #include2 using namespace std; 3 char a[101]; 4 int a1[101],b1[101]; 5 int la,lb,N; 6 void Turn(){ //将输入的字符串转换为数组 7 for(int i=0;i ){ 8 a1[i]=a[i]-'0'; 9 } 10 } 11 bool check(){ //检测是否为回文数 12 for(int i=0;i ){ 13 if(a1[i]!=a1[la-i-1]){ 14 return false; 15 } 16 } 17 return true; 18 } 19 void Add(){ //高精度加法 20 for(int i=0;i ){ 21 b1[i]=a1[la-i-1]; 22 } 23 la+=2; 24 for(int i=0;i ){ 25 a1[i]+=b1[i]; 26 if(a1[i]>=N){ 27 a1[i+1]++; 28 a1[i]-=N; 29 } 30 } 31 while(!a1[la-1]) la--; 32 } 33 int main() 34 { 35 int step=0; 36 scanf("%d%s",&N,a); 37 la=strlen(a); 38 Turn(); 39 while(!check()){ //此处不需要担心输入值即是回文数,如果输入为回文数则不会进入循环 40 step++; 41 if(step>30){ 42 break; 43 } 44 Add(); 45 } 46 if(step<=30){ 47 printf("%d",step); 48 } 49 else{ 50 printf("Impossible"); 51 } 52 return 0; 53 }