B. Palindromic Numbers

最开始我没看清题干,想着打个表暴力破解一波,直接白给还浪费大把时间,但是实际上题目给的数据极大,需要用到高精度减法

具体思路:题目要求给定一个数m,输出一个数ans使得ans+m的值为回文数,并且ans和m的长度相等,都为cnt(也就是二者数量级一致),可以直接构造一个足够大的回文数减去m得到ans,具体分为两种情况,

1、m的第一位为9,需要进位则构造回文数11...11,例如m=99 构造回文数111,回文数比m多一位

2、m的第一位不为为9,则不需要进位,构造回文数99..99,例如m=91 构造回文数99,回文数和m位数相等

#include<iostream>
#include<math.h>
#include<vector>
#include<algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define oo 0x3f3f3f3f
#define x first
#define y second
const int maxn = 2e5 + 10;
using namespace std;
long long num[100000]={0};

int len;
string m;
int cmp(string m, string n)
{
	if (m.length() != n.length())
		return m.length() < n.length();
	else
	{
		for (int i = 0; i <= m.length() - 1; i++)
		{
			if (m[i] != n[i])
				return m[i] < n[i];
		}
	}
}
void slove(string m)
{
	vector<int> a, b, c;
	string n;
	if (m[0] != '9')//构造999
		for (int i = 1; i <= len; i++)
			n += '9';
	else
		for (int i = 1; i <= len + 1; i++)//构造1111
			n += '1';
	if (cmp(m, n))//比较大小,使得m大于n
	{
		string t;
		t = m;
		m = n;
		n = t;
	}
	for (int i = 0; i < m.length(); i++)
		a.push_back(m[m.length() - 1 - i] - 48);//将数字从个位到最高位,逆序放入动态数组
	for (int i = 0; i < n.length(); i++)
		b.push_back(n[n.length() - 1 - i] - 48);
	int cnt = 0;

	while (cnt < a.size() && cnt < b.size())
	{
		if (a[cnt] < b[cnt])//不够就借位相减,
		{
			a[cnt] += 10;
			a[cnt + 1]--;
		}
		c.push_back(a[cnt] - b[cnt]);
		cnt++;
	}

	for (int i = cnt; i < a.size(); i++)//如果最后数组中还有剩的数字直接补上c数组
		c.push_back(a[i]);

	for (int i = c.size() - 1; i >= 0; i--)//反向输出
	{
		if (i == c.size()-1 &&                                                                                       c[i] == 0)
			continue;
		cout << c[i];
	}
	cout << "\n";
}

int main()
{
	int t;
	cin >> t;
	int cnt = 1;
	while (t--)
	{
		cin >> len;//位数
		cin >> m;//给定数字
		slove(m);
	}
	return 0;
}

这段代码也可以实现在一个区间内寻找回文数并计算它们的和。 其中 `isPalindromic` 函数用于判断一个数是否为回文数,`getInputs` 函数用于获取区间的上边界和下边界,并检查用户的输入是否合法。在主程序中,我们首先调用 `getInputs` 函数获取区间的上边界和下边界,然后通过循环遍历这个区间,找到其中所有回文数,并将它们存储在一个列表中。最后,我们计算这些回文数的总和,并输出结果。 这段代码的工作流程与之前的示例代码基本相同,唯一的区别是在输入区间时,代码将上边界和下边界分别存储在 `upper` 和 `lower` 变量中,并检查它们的大小关系。如果用户输入的上边界比下边界小,则交换它们的值,以确保下边界始终小于或等于上边界。 下面是这段代码的完整实现: ```python def isPalindromic(n): s = str(n) return s == s[::-1] def getInputs(): count = 0 while count < 3: try: upper = int(input("请输入区间的上边界:")) lower = int(input("请输入区间的下边界:")) if upper > lower: upper, lower = lower, upper return upper, lower except: print("输入有误,请重新输入!") count += 1 print("输入错误次数过多,程序退出!") exit() palindromic_list = [] upper, lower = getInputs() for i in range(lower, upper + 1): if isPalindromic(i): palindromic_list.append(i) total = sum(palindromic_list) print("区间[{},{}]中的回文数为:{}".format(lower, upper, palindromic_list)) print("它们的和为:{}".format(total)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值