【洛谷】P1015 [NOIP1999 普及组] 回文数
作者:互联网
预备知识点
高进度加法
给出a, b两数,按照N进制相加
1.将a, b两数按字符形式存放在字符数组当中
2.将a, b两数从字符形式处理成数字形式(通常为减‘0’,偶尔会为减‘A’加10)
3.将数组翻转,0号位储存个位
4.进行竖式加法(可以用a数组储存结果,逢N进一)
注:只会进一,假设进二,那么相加的两数最小都会是N,这是不可能满足的
5.注意:最高位后一位在相加时仍然可能进位,要留出空位
6.将空出的进位0删除
原题链接
解题思路
题目的难点在于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