御坂御坂


私信TA

用户名:jiangpeiwen

访问量:843

签 名:

座位靠窗,王的故乡

等  级
排  名 1242
经  验 3058
参赛次数 0
文章发表 1
年  龄 19
在职情况 学生
学  校 南理
专  业 大数据

  自我简介:

TA的其他文章

解题思路:


根据题意我们知道实现程序的话,主要是下面函数的循环:

定义cot = 0,cot是用来记录循环次数
由于(0<=M<=maxlongint)较大,我们使用数组进行储存数据,防止数据过大溢出

定义数组 store[100];
memset(store,0,sizeof store);

1.输入数据,将数据储存在数组里

2.判断是否为回文数(如果为回文数我们就跳出循环,否则进行下一步处理)

3.进行回文操作,并与原数据进行相加处理(因为我们使用的是数组进行每一位数的存储,因此我们可以先不考虑进制问题)

4.再进行进制转换处理

5.cot ++,返回第2步进行判断


注意事项:
对于大数计算方法不懂的可以看一下这一题:大数加法


下面是这一题的函数


由于 long long 的最大值:9223372036854775807

因此我们开辟100位空间绰绰有余

将数据存入数组store中

采取逆位储存,即最小位放在最前面,便于之后的进位运算

string M;
cin >> N >> M;
memset(store,0,sizeof store);
	
for(int i = M.size() - 1,j = 1;i >= 0;i --,j ++)//这里是从下标为1开始
store[j] = (M[i] - '0');

else

cin >> N >> M;
memset(store,0,sizeof store);

int i = 1;//下标为1开始
while(M)
{
	A[i ++] = M % 10;
	M /= 10;  
}


当我们使用数组时通常要知道其数据位数,每次相加后可能会进位,ize + 1

更新数据的位数

void up_data()
{
	int i;
	for(i = 105;i >= 1;i --)//当遇到不为零的数时,即为最高位上的值
	if(store[i] != 0)
	break;
	size = i;
}


与回文数相加

我们只需要将原数组逆序输出即可得到回文数

可以开辟一个新的数组进行存储

store1[100];

for(int i = size;i >= 1;i --)//这时size的用处就体现出来了,将数组逆位输出
store1[n ++] = store[i];

for(int i = 1;i <= size;i ++)//再进行相加
store[i] += store1[i];


进制转换

for(int i = 1;i = N)//判断这一位是否大于N,是的话向前进一位
	{
		store[i] -= N;
		store[i + 1] ++;
	}
}


判断是否为回文数(是返回 1,否则返回 0)

int set_up()
{
	for(int i = 1,j =size;i < j;i ++,j --)
	if(store[i] != store[j]) return 0;
	return 1;
}





参考代码(成功AC):

#include #include  #include using namespace std;

int store[100];
int N,cot;
string M;
int size;//记录当前数据的位数

void up_data()
{
	int i;
	for(i = 99;i >= 1;i --)
	if(store[i] != 0)//当查询到不为零时,正好为其最高位位数
	break;
	size = i;
}

void HUIWEN()//进行回文操作相加并进行进制转换处理
{
	int store1[100];
	int n = 1;
	
	for(int i = size;i >= 1;i --)
	store1[n ++] = store[i];
	for(int i = 1;i <= size;i ++)
	store[i] += store1[i];

	for(int i = 1;i = N)
		{
			store[i] -= N;
			store[i + 1] ++;
		}
	}
	up_data();//每次进行数据处理后,进行位数的更新
}

int set_up()
{
	for(int i = 1,j =size;i < j;i ++,j --)
	if(store[i] != store[j]) return 0;
	return 1;
}

int main()
{
	cin >> N >> M;
	memset(store,0,sizeof store);
	
	for(int i = M.size() - 1,j = 1;i >= 0;i --,j ++)
	store[j] = (M[i] - '0');
	
	up_data();//先更新初始位数

	while(cot < 30)
	{
		if(set_up()) break;//判断是否为回文数
		HUIWEN(); 
		cot ++;//记录运行的次数
	}
	
	if(cot == 30)
	{
		cout<<"Impossible!";
		return 0;
	} 
	cout <<"STEP="<< cot;
	return 0;
}


 

0.0分

6 人评分

  评论区

  • «
  • »