输入一个以#结束的字符串,滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,输出该字符串并将其转换为十进制数后输出。
输入格式:
输入在一行中给出一个不超过80个字符长度的、以#结束的非空字符串。
输出格式:
第1行中输出已滤去所有非十六进制字符的字符串。
在第2行中输出转换后的十进制数。题目保证输出结果在长整型范围内。
输入样例:
-zy1+Ak0-bq?#
输出样例:
1A0b
6667
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
代码详解:
这段代码主要先输入字符并将其转换为字符串,其次将字符数组进行提取
并将提取出的结果存入新的数组中,并再次复制数组进行隔离(为了最后的结果可以输出原来提取出的数组)
随后将大小写提取出来并将其统一(在这个代码下选择的是字符全部转换为大写)
但由于所提取出来的数组是字符数组,在最后还需要将数组由字符转换为数字,而后根据每个转换出来的数字进行16进制的计算与转换,随后分别输出题目所需要的结果。
但由于我比较菜(菜就多练(bushi))所以变量用的比较多,看着比较麻烦,但大体是对的,也过了提交,果然,还是要多练习啊,然后各位大佬有更好的算法也可多多指点,再此本人不胜感激
代码展示
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
int main(void)
{
char j[80];
char j1[80];
int k = 0;
int count = 0;
while ((j[k] = getchar()) != '#')
{
k++;
}
j[k] = '\0';
for (int g = 0; g < k; g++)
{
if ((j[g] >= 48 && j[g] <= 57) || (j[g] >= 65 && j[g] <= 70) || (j[g] >= 97 && j[g] <= 102))
{
count++;
j1[count - 1] = j[g];
}
}
char j2[80];
for (int h = 0; h < count; h++)
{
j2[h] = j1[h];
}
for (int jk = 0; jk < count; jk++)
{
if (j1[jk] >= 97 && j1[jk] <= 102)
{
j1[jk] = j1[jk] - 32;
}
}
int sum = 0;
int count1 = count;
for (int jaa = 0; jaa < count; jaa++)
{
int h = j1[jaa];
if (h >= 48 && h <= 57)
{
h = h - 48;
}
else if (h >= 65 && h <= 70)
{
h = h - 55;
}
sum = sum + h * pow(16, count1 - 1);
count1--;
}
for (int v = 0; v < count; v++)
{
printf("%c", j2[v]);
}
printf("\n");
printf("%d", sum);
}