USACO基础第七题Palindromic Squares
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; }