其他分享
首页 > 其他分享> > 【洛谷】P1015 [NOIP1999 普及组] 回文数

【洛谷】P1015 [NOIP1999 普及组] 回文数

作者:互联网

预备知识点

高进度加法
给出a, b两数,按照N进制相加
1.将a, b两数按字符形式存放在字符数组当中
2.将a, b两数从字符形式处理成数字形式(通常为减‘0’,偶尔会为减‘A’加10)
3.将数组翻转,0号位储存个位
4.进行竖式加法(可以用a数组储存结果,逢N进一)
注:只会进一,假设进二,那么相加的两数最小都会是N,这是不可能满足的
5.注意:最高位后一位在相加时仍然可能进位,要留出空位
6.将空出的进位0删除

原题链接

P1015 [NOIP1999 普及组] 回文数

解题思路

题目的难点在于N进制加法,使用高进度加法解决

ac代码

#include <iostream>
#include <cstring>
using namespace std;
const int MAX = 303;

int n, l;
char m[MAX], a[MAX];//c数组储存输入的数(不能直接用int储存数据,因为十六进制的数中含有字母)

void add() {//高进度加法 
//高进度加法当中,要将数据翻转,数组0位储存个位 
//由于本题当中本就是原数和翻转之后的数相加,所以不需要再一次翻转 
	for (int i = 0; i < l; ++i)
		a[l - i - 1] = m[i];//a数组用来储存m数组翻转后的数字 

	l += 1; //可能有进位,所以在前面多空一位

	for (int i = 0; i < l; ++i) {
		m[i] += a[i];
		if (m[i] >= n)
			m[i + 1]++, m[i] -= n;
	}//进行N进制加法

	while (!m[l - 1])
		--l; //去掉之前为进位留出来的,但是没有用上的0。
}

bool judge() { //judge函数用来判断是否是回文数
	for (int i = 0; i < l; i++) {
		if (m[i] != m[l - 1 - i]){
			return false;
		}		
	}
	return true;
}

int main() {
	scanf("%d%s", &n, m);//n代表输入的进制

	l = strlen(m);
	for (int i = 0; i < l; ++i) {
		if (m[i] >= '0' && m[i] <= '9')
			m[i] -= '0';
		else
			m[i] = m[i] - 'A' + 10;
	}//预处理:字符转化为对应数字

	int step = 0;
	while (!judge()) {
		add();
		step++;
		if (step > 30){
			cout << "Impossible!";
			return 0;
		}
	}

	cout << "STEP=" << step;
	
	return 0;
}

标签:储存,洛谷,数组,P1015,++,int,NOIP1999,加法,两数
来源: https://blog.csdn.net/qq_55475680/article/details/122718571