原题链接:回文数(二)
解题思路:明白十进制的加法:逢十进一, 借一当十,其他进制数类似;
注意事项:在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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复