嗯好久不做USACO,想了想不论如何还是要把这个OJ刷通关的,否则无法纪念我的生涯。
题目概述:
给定一个进制n,然后让你检验10进制下的1-300在n进制下的平方数是不是回文数,是的话把该数和其平方都用n进制打印出来。
算法思想:
这个题一共就有两个部分。第一个部分是进制转换,第二个部分是判断回文。因为C++有string这种东西就方便很多,这样就不用费心想char数组啦哈哈哈。
另外我写程序的时候没有经过思考,is_pal() 这个函数完全可以由等号和reverse替代嗯。
代码部分:
#include <iostream> #include <fstream> #include <string> using namespace std; int base; char c[21] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J' }; bool is_pal(string s) { int size = s.size(); for (int i = 0, j = s.size() - 1; i < j;i++,j--){ if (s[i] != s[size - i - 1]) return false; } return true; } string reverse(string s) { string res = ""; for (int i = 0; i < s.size(); i++){ res += s[s.size() - i - 1]; } return res; } string change_base(int n){ string res = ""; while (n != 0) { int tmp = n%base; res += c[tmp]; n /= base; } return res; } int main(){ ifstream fin("palsquare.in"); ofstream fout("palsquare.out"); fin >> base; for (int i = 1; i <= 300; i++){ if (is_pal(change_base(i*i))) { string t = reverse(change_base(i)); string tm = reverse(change_base(i*i)); for (int i = 0; i < t.size(); i++){ fout << t[i]; } fout << " "; for (int i = 0; i < tm.size(); i++){ fout << tm[i]; } fout << endl; } } return 0; }