n进制下加法和回文数

xiaoxiao2021-02-28  55

点击打开链接

题目大意:

    若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。

例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。

又如:对于10进制数87:STEP1:87+78 = 165 STEP2:165+561 = 726STEP3: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!”

题目思路:

    手动模拟倒序相加的步骤。

#include<bits/stdc++.h> using namespace std; int n,m,len,step,a[1001];//n进制 string x;//n进制下的数x bool judge(int len) { for(int i=0;i<=len/2;i++) if(a[i]!=a[len-i-1]) return 0; return 1; } int fun(int len) { int c[10001] = {0},s=0; for(int i=0;i<len;i++) //倒序相加,但由于是回文数,所以看上去是正序的 { c[i] = a[i]+a[len-i-1]+c[i]; c[i+1] += c[i]/n; //i+1位加上进的位数 c[i] %= n; //第i位是%n进制数 } if(c[len]!=0) len++; for(int i=len-1;i>=0;i--) { a[s++] = c[i]; } // for(int i=0;i<len;i++) // cout<<a[i]; // cout<<endl; return len; } int main() { scanf("%d",&n); cin>>x; len = x.length(); for(int i=0;i<len;i++) { if(x[i]<'A') //如果不是十六进制的,那么就是-‘0’ a[i] = x[i]-'0'; else//如果是16进制,就是-‘A’+10 a[i] = x[i]-'A'+10; } while(step<=30) { step++; len = fun(len); if(judge(len)) { cout<<"STEP="<<step<<endl; return 0; } } cout<<"Impossible!"<<endl; return 0; }
转载请注明原文地址: https://www.6miu.com/read-2150010.html

最新回复(0)