USACO很多函数都限制掉了,不让用,所以很多库函数都会WA,后面找的模板和库函数都用不上了,逼我直接写了个最脑残的程序,输入输出还输反了。无限wa。总之要小心,库函数不要随便用。特别是比较生疏的,wa的可能性比较大。可能网站的目的就是让自己从头开始写,什么都得自己写。比如itoa,goto等都不提供。纯粹的编码。strlen都不让用。
因为这个题是处理数,所以平时那些对付字符串的函数都用不上。把数字转化成字符串其实有函数,但是绝对不好使。网站不会这么轻易让你ac的。这是我用字符串接受和保存进制转换的代码:
//s[]: 原进制数字,用字符串表示
//s2[]: 转换结果,用字符串表示
//d1: 原进制数
//d2: 需要转换到的进制数
//高于9 的位数用大写'A'~'Z'表示,2~16 位进制通过验证
void change(char s[], char s2[], int d1, int d2)
{
int i, j, t, num = 0;
char c;
for (i = 0; s[i] != '\0'; i++)
{
if (s[i] <= '9' && s[i] >= '0')
t = s[i] - '0';
else t = s[i] - 'A' + 10;
num = num * d1 + t;
}
i = 0;
while (true)
{
t = num % d2;
if (t <= 9)
s2[i] = t + '0';
else s2[i] = t + 'A' - 10;
num /= d2;
if (num == 0)break;
i++;
}
for (j = 0; j < i / 2; j++)
{
c = s2[j];
s2[j] = s[i - j];
s2[i - j] = c;
}
s2[i + 1] = '\0';
}
判断字符串是不是回文串的比较简单:
//判断是否是回文串
bool pal(char s[])
{
int i;
for (i = 0; s[i] != '\0'; i++);
bool flag = true;
for (int k = 0; k < i / 2; k++)
if (s[k] != s[i - k - 1])
{
flag = false;
break;
}
return flag;
}
最后就是说一下itoa这个函数,百度到的,感觉挺好用,以为这么就过了,但是网站是返回wa的。如果是正式的比赛应该可以使用。
函数原型是char *itoa(int value, char *string, int radix);
value: 待转化的整数
radix: 是基数的意思,即先将value转化为radix进制的数,范围介于2-36
*string: 保存转换后得到的字符串
返回值:同*string
它还有其他的一些变形,比如整数数范围可以是long等等。
本题写的脑残代码如下,供参考:
/*
ID: like_091
PROG: palsquare
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<algorithm>
#include<string>
#include<map>
using namespace std;
//判断是否是回文串
bool pal(int s[], int n)
{
bool flag = true;
for (int i = 0; i < n; i++)
if (s[i] != s[n - i - 1])
{
flag = false;
break;
}
return flag;
}
int change(int n[], int x, int t)
{
int k = 0;
while (x > 0)
{
n[k++] = x % t;
x /= t;
}
return k;
}
int main(void)
{
ifstream cin("palsquare.in");
ofstream cout("palsquare.out");
int x;
while (cin>>x)
{
for (int i = 1; i <= 300; i++)
{
int num[20];
int t = change(num, i * i, x);
if (pal(num, t))
{
int fun[20];
int y = change(fun, i, x);
for (int i = y - 1; i >= 0; i--)
{
if (fun[i] >= 0 && fun[i] <= 9)
cout<<fun[i];
else cout<<char(fun[i] + 'A' - 10);
}
cout<<" ";
for (int i = 0; i < t; i++)
{
if (num[i] >= 0 && num[i] <= 9)
cout<<num[i];
else cout<<char(num[i] + 'A' - 10);
}
cout<<endl;
}
}
}
return 0;
}