c语言—— 回文数

对于一个自然数n,若将n的各位数字反向排列所得的数n1与n相等,则称n为回文数,例如2332。
若给定一个N( 2<=N<=16)进制数M(M的长度在一百位以内),如果M不是回文数,可以对其进行N进制加法,最终得到回文数。
例如对于十进制数79 STEP1 : 79 + 97 = 176 STEP2 : 176 + 671 = 847 STEP3 : 847 + 748 = 1595 STEP4 : 1595 +5951 = 7546 STEP5 : 7546 + 6457 = 14003 STEP6 : 14003 + 30041 = 44044
那么对于给定的N进制数M,请判断其能否在30步以内(包括30步)得到回文数。

输入格式

第一行包括一个正整数 N(2<=N<=16)。
第二行包括一个正整数M(一百位以内)。

输出格式

如果可以在n步内得到回文数,输出“STEP=n”,否则输出“NO”。

输入样例1

10
79

输出样例1

STEP=6

输入样例2

8
665556

输出样例2

NO

 注解:不同进制,在进位时要除或者取余相应的数

                获取反转数的时候也是要乘以相应的数字

例如        八进制进位时:该位置要除八得到进位数;取余八得到当前位的数字;

反转时当前数字乘以八再加上后一个数字(后一个数字为当前数字的个位)

反转原理:将需要反转的数字不断取到其个位上的数字,乘以相应的进制数加上其十位上的数字,再抹去个位,使得十位变个位,不断循环最后得到反转数字;

这边加法运算可以运动大数加法的思想;

#include 
#include 
#include 
using namespace std;
unsigned long long reverse=0,k,len,nex;
string hws;
bool judge(unsigned long long reverse)
{
	unsigned long long reverse1 = 0;
	for(unsigned long long i = reverse;i;i/=k)
	{
		reverse1=reverse1*k+i%k;
	}
	nex = reverse1 + reverse;
	return reverse==reverse1;
	
}
unsigned long long change(char a)
{
	if(a>='0'&&a<='9')return  a-'0';
	return a-'A'+10;
}

int main(){
	unsigned long long step;
	
	scanf("%lld",&k);
	cin>>hws;
	unsigned long long len = hws.length();
	for(int i = 0;i

你可能感兴趣的:(算法)