解题思路:
分步求解:
获得输入,进制(整数),数字(存为字符串数组);
获取输入数字的长度;
将字符串数组转化为整型数组(便于后续处理);
将输入的数字反向;
将输入的正向数字与转向后的反向数字相加;
判断相加后的和是否为回文;
循环反向并相加。
注意事项:
1. 输入进制的目的是按照输入的进制直接进行相加,而不需要换成十进制。2. 在相加的过程中 数字的长度是变化的,需要根据最新的结果更新。
参考代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//对输入的数字 字符串 进行翻转
void intRever(int origNum[], int length, int tarNum[])
{
int i,j;
for(i = 0, j = length -1; i < length; i++, j--)
{
tarNum[i] = origNum[j];
}
tarNum[i] = '\0';
}
//判断输入数据是否为回文数
int isRever(int origNum[], int length)
{
int i,j;
i=0;
j=length-1;
while(i<j && origNum[i]==origNum[j])
{
i++;
j--;
}
return i>=j;
}
//逐步递增获取回文数
void getPalin(int origNum[], int *length, int tarNum[], int hex)
{
int i,k = 0;
for(i = 0; i < *length; i++)
{
origNum[i] = origNum[i] + tarNum[i] + k;
k = origNum[i]/hex;
origNum[i] %= hex;
}
if(k > 0)
{
origNum[i] = k;
*length = i+1;
}
}
void charToInt(char origInput[],int length,int origNum[])
{
int i = 0;
for(i = 0; i < length; i++)
{
if(origInput[i] >= 'A' && origInput[i] <= 'F')
origNum[i] = origInput[i] - '0' - 7;
else if(origInput[i] >= 'a' && origInput[i] <= 'f')
origNum[i] = origInput[i] - '0' - 39;
else if(origInput[i] >= '0' && origInput[i] <= '9')
origNum[i] = origInput[i] - '0';
else
{
printf("input error\n");
}
}
origNum[i] = '\0';
}
int main()
{
int hex;
char charInput[1000];
int stepTotal = 30;
while((scanf("%d",&hex)==1))
{
if(hex < 2 || hex > 16)
{
return 0;
}
if((scanf("%s",charInput)==1))
{
int origNum[1000] = {0};
int tarNum[1000] = {0};
int step = 0;
int length = strlen(charInput);
charToInt(charInput,length,origNum);
while(step<=stepTotal)
{
intRever(origNum, length, tarNum);
getPalin(origNum, &length, tarNum, hex);
step += 1;
if(isRever(origNum, length)==1)
{
printf("STEP=%d\n",step);
break;
}
}
if(step > stepTotal)
printf("Impossible!\n");
}
}
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复