《编程思维与实践》1041.十六进制

《编程思维与实践》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;
} 

猜你喜欢

转载自blog.csdn.net/boxueyuki/article/details/130484651