ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-27 15:58:00  阅读:205  来源: 互联网

标签:储存 洛谷 数组 P1015 ++ int 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有