《编程思维与实践》1041.十六进制
题目
思路
由于两个十六进制数不会出现首位相接的情况,所以可以直接通过找到0x出现的位置来判断是否有十六进制数:
1.通过strstr函数来找寻第一个0x的位置;
2.找到0x的位置后从0x后开始遍历,判断是否下一位是在0到9或者a到f之间,一旦不是就需要终止遍历;
3.终止遍历后判断是否有合法的十六进制数,有则直接输出;
4.迭代进行下一轮寻找(反复寻找直到后面没有出现0x);
5.需要用一个变量存取总共统计的十六进制数,但它为0时需要输出-1;
注意的点:
十六进制数是在unsigned int的范围内.
代码
#include<stdio.h>
#include<string.h>
int count=0; //记录合法数字个数
void solve(char *temp)
{
unsigned int num=0;
int flag=0; //判断是否有十六进制的数字
for(int i=0;i<strlen(temp);i++)
{
if(temp[i]>='0'&&temp[i]<='9')
{
num=num*16+temp[i]-'0';
flag=1;
}
else if(temp[i]>='a'&&temp[i]<='f')
{
num=num*16+temp[i]+10-'a';
flag=1;
}
else
{
break; //非合法数字直接终止循环
}
}
if(flag) //有合法数字
{
count++;
printf("%u ",num);
}
temp=strstr(temp+2,"0x")==NULL?NULL:strstr(temp+2,"0x")+2; //下一轮寻找
if(temp!=NULL)
{
solve(temp); //迭代
}
}
int main()
{
char s[100001];
scanf("%s",s);
char* temp=strstr(s,"0x")==NULL?NULL:strstr(s,"0x")+2; //存搜索0x得到的地址(+2表示从0x后开始)
solve(temp);
if(count==0)
{
printf("-1\n");
}
return 0;
}