原题链接:回文数(二)
解题思路:明白十进制的加法:逢十进一, 借一当十,其他进制数类似;
注意事项:在10进制以上的进制数,有这样的对应关系:10-A,11-B,12-C,13-D,14-E,15-F,我们可以用map来进行对应,计算时利用键,而存储结果时利用值;
参考代码:
#include <bits/stdc++.h> #define maxlongint 1001 #define limit 30 using namespace std; char str[maxlongint] = {0}; char result[maxlongint] = {0}; map<int, char>mybinary; void initial()// 处理10进制数以上进制的转换 { for(int i=0; i<10; i++) mybinary[i] = '0'+i; for(int i=10; i<16; i++) mybinary[i] = i-10+'A'; } bool judge(char *str, int flag) //判定是否位回文数 { int left = 0, right = flag-left; while (left<right) { if(str[left] != str[right]) break; else { left++; right--; } } if(left < right) return false; else return true; } int main() { int binary; //进制数(2,8,10,16) initial(); cin >> binary; scanf(" %s", str); //给定进制数; int flag = strlen(str)-1; int cot = 0; //计算执行加法的次数; while (cot++ < limit) { int left = 0, right = flag-left; int mod = 0; //处理进位; int tmt; while (left <= flag) { /*以下的两条if结构处理(10-A,11-B,12-C,13-D,14-E,15-F)*/ if('A'<=str[left] && str[left]<='F') str[left] -= 7; if('A'<=str[right] && str[right]<='F') str[right] -= 7; tmt = (str[left]-'0') + (str[right]-'0') + mod; result[left] = mybinary[tmt%binary]; mod = tmt/binary; left++; right--; } if(mod == 1) { result[left] = 1+'0'; flag++; } if(judge(result, flag)) break; else strcpy(str, result); } if(cot > limit) cout << "Impossible!" << endl; else cout << "STEP=" << cot << endl; return 0; }
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复