USACO 1.3.4 回文平方

1.3.4 回文平方

题目考查

字符串和数字相互转化, 进制转换, 判断回文数字

解题思路

首先我们理清我们都需要实现哪些操作:

  1. 把一个十进制数字转化为B进制
  2. 判断一个数字是否为回文数字

对于十进制转化为B进制: 我们只需要模拟以前学的"短除法"即可, 最后把得到的数字逆序后即为所求.

对于判断数字是否是回文数字: 对于一个int类型而言, 判断这个数字是否回文是很不方便的. 我们通常的做法就是把它转换成字符串类型, 然后模拟我们人脑判断的方式即可.

题目细节

C++内部实现了string类型, 和char[]类型相比, 真是有好有坏. 我们可以借助这个题稍微谈两点.

  1. to_string()函数, 可以把一个整型, 浮点型转换成string类型. 如: string s = to_string(num)

    那如果我想把一个string转换成回去呢?

    很遗憾, string本身没有实现这样的功能, 但是c语言中的char[] 可以做到字符串到整型的变换.

    我们可以通过atoi()函数, 把一个char数组转换成int类型. int num = atoi(s)

    比较幸运的是, c++为了让string向下兼容, 提供了一个c_str()函数, 可以把string转换成char[]来用. int num = atoi(s.c_str()) 因此我们可以用这样的方式把string转回int类型.

  2. 回文数字的判断, 我们比较笨的方法就是采用双指针去前后扫描一遍. 但本题回文数字的长度不会很长, 我们可以采用一种更暴力的来判断. 直接判断字符串翻转前后是否相同即可.

  3. 进制转换的过程中, 为了避免数字0的情况, 我们应当采用do-while循环(其实很多对数位有关的操作我都推荐用do-while).

AC代码
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
using namespace std;
typedef long long ll;
char getc(int x) { return x < 10 ? '0' + x : 'A' + x - 10; }
string fact(int x, int b) {
	string s;
	do {
		s += getc(x % b);
		x /= b;
	} while (x);
	reverse(s.begin(), s.end());
	return s;
}
int main()
{
	int b; cin >> b;
	rep(i, 300) {
		string s = fact(i * i, b);
		string t = s;
		reverse(t.begin(), t.end());
		if (s == t) printf("%s %s\n", fact(i, b).c_str(), s.c_str());
	}

	return 0;
}

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥Fau

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值