75分求助,有注释哦
查看原帖
75分求助,有注释哦
816549
52wyd楼主2022/12/7 10:45
#include <stdio.h>
#include <string.h>

int k, bushu, len;
char str[10000], cp[10000];//cp储存原来的数的反转数

void change();//把这个数与它的反转数相加
int judge(); //判断是否是回文数

int main(void)
{
	scanf("%d%s", &k, str);//读入进制k和高精数str
	len = strlen(str);//计算高精数的位数
	
	if (judge())//开始即为回文数
	{
		printf("STEP=0");
		return 0;
	}
	
	for (bushu = 0; ; bushu ++)//bushu步数
	{
		if (bushu == 30)
		{
			printf("Impossible!");
			return 0;
		}
		change();	//改变高精数str
		if (judge())  //判断改变后的str是否为回文数
		{
			printf("STEP=%d", bushu + 1);   
			return 0;
		}
	}
}

void change()
{
	int i, j, m, si, s, c;
	
	for (i = len - 1, j = 0; i >= 0; i --, j ++)//cp储存原来的数的反转数		
		cp[j] = str[i];	
	
	m = 0;
	for (i = 0; i <= len - 1; i ++)//高精加运算
	{
		if (str[i] <= '9')//把str、cp中的某一位用int类型储存
			s = str[i] - '0';
		else
			s = 10 + (str[i] - 'A');
		if (cp[i] <= '9')
			c = cp[i] - '0';
		else
			c = 10 + (cp[i] - 'A');
		m += s + c; //开始高精加计算
		si = m % k;
		if (si <= 10)
			str[i] = '0' + si;
		else
			str[i] = 'A' + (si - 10);
		m = (m - si) / k;	
	}
	
	if (m != 0)//判断是否需要进位
	{
		if (m <= 10)
			str[len] = '0' + m;
		else
			str[len] = 'A' + (m - 10);
		len ++;
	}
}

int judge()
{
	for (int i = 0, j = len - 1; i <= j; i ++, j --)
		if (str[i] != str[j])
			return 0;
	
	return 1;
}




2022/12/7 10:45
加载中...