蓝桥杯基础-014-Decimal_To_Hexadecimal

本文介绍了一种使用Java实现将整数转换为十六进制字符串的方法。通过定义一个字符数组来映射十进制到十六进制,并采用取模和除法运算实现了整数的十六进制转换。

题意

输入一个整数n(0 <= n <= 2147483648)

(其中java中 int [ -2^31 , 2^31 ] <- 32 = 4*8)&& 2^31 = 2147483648)->即n 为 int 即可

代码

import java.util.Scanner;


public class Main {

	public static void main(String[] args) {

		char[] HexDecimalAlphabet = new char[16];
		char[] A_F_Alphabet = {'A','B','C','D','E','F'};
		char[] Stack = new char[8];
 		for (int i = 0; i < HexDecimalAlphabet.length; i++) {
			if(i<10)
				HexDecimalAlphabet[i] = (char)((int)'0'+i);
			else
				HexDecimalAlphabet[i] = A_F_Alphabet[ i%10 ];
 		}

 		Scanner keyin = new Scanner(System.in);
 		int n = keyin.nextInt();
 		int cnt = 0;
 		do{
 			Stack[cnt] = HexDecimalAlphabet[n % 16];
 			cnt++;
 			n = n / 16;
 		}while( n != 0);
 		for (int i = cnt - 1; i >= 0; i--) {
			System.out.print(Stack[i]);
		}
	}
}
Summary

i) 先建立HexadecimalAlphabet对映表; 

ii ) 对n进行取位数操作(1.n MOD 16, 2. n /= 16,3. while(n != 0) <-欧几里得算法) ; 

iii) ch = HexdicimalAlphabet[sub (= MOD所得数)] && 压栈(或记入数列) ; 

iv) 出栈(逆序输出数列)

<think>好的,我现在需要帮助用户解决CMake构建过程中遇到的lconv结构体大小测试失败、HAVE_DECIMAL_POINT测试失败以及Locale功能不支持的问题,特别是涉及jsoncpp库的情况。首先,我需要了解这些错误的可能原因,然后根据已有的引用信息和相关知识提出解决方案。 首先,用户提供的引用中提到了几个相关的问题。引用[2]讨论了CMAKE_BUILD_TYPE和BUILD_SHARED_LIBS的设置,这可能影响构建类型和库的生成方式。引用[3]中提到了处理CMake测试失败的经验,比如查找pthread库时的问题,最终通过调整CMake配置解决。这可能提示我需要检查CMake的测试逻辑,或者需要手动设置某些变量来绕过测试失败。 接下来,分析具体错误。当CMake测试lconv结构体的大小失败时,可能是因为目标平台的标准库中lconv的定义与CMake测试的预期不符。HAVE_DECIMAL_POINT测试失败可能意味着系统缺少支持locale和decimal_point的环境。Locale功能不支持通常与系统的locale配置或相关库缺失有关,特别是在跨平台编译或不同系统版本中可能出现。 解决方案可能包括以下几个步骤: 1. 更新CMake和工具链:确保CMake版本足够新,可能修复已知的兼容性问题。同时,更新编译器和系统库,确保支持所需功能。 2. 安装或更新locale相关库:例如,在Ubuntu/Debian上安装libc6-dev或locale包,确保系统有正确的locale支持。 3. 手动设置CMake变量:如果自动测试失败,可以尝试手动定义HAVE_LCONV_SIZE和HAVE_DECIMAL_POINT,强制CMake使用这些值,避免测试失败导致的中断。例如,通过命令行参数传递-DHAVE_LCONV_SIZE=...。 4. 修改CMakeLists.txt:针对jsoncpp的构建文件,添加检查或强制设置相关变量,确保测试通过或跳过不必要的测试。 5. 检查系统locale配置:运行locale命令确认系统locale设置正确,必要时生成所需的locale。 6. 交叉编译时的处理:如果是交叉编译,可能需要指定正确的sysroot或工具链文件,确保CMake能找到目标平台的库和头文件。 在引用中,用户提到删除重装解决了问题,这可能是因为旧有的构建缓存或错误配置导致的问题,因此清理构建目录或重新生成构建系统也是有效的步骤。此外,引用[3]中的解决方式是通过继续查找库并最终找到正确的pthread库,类似地,可能需要确保系统安装了正确的依赖库。 最后,需要验证解决方案的有效性,建议用户在执行上述步骤后重新运行CMake并构建项目,观察是否仍有错误。如果问题依旧,可能需要更详细地查看CMake输出的日志,定位具体的测试失败原因,并针对性处理。</think>### 解决CMake构建中`lconv`和`HAVE_DECIMAL_POINT`测试失败问题 在编译`jsoncpp`或其他依赖本地化(locale)功能的项目时,若CMake测试`lconv`结构体大小或`HAVE_DECIMAL_POINT`失败,通常与系统环境、工具链配置或依赖库缺失有关。以下是分步解决方案: --- #### 1. **更新工具链和依赖库** - **CMake版本**:确保使用最新版CMake(≥3.10)。旧版本可能包含已知的配置问题。 ```bash sudo apt-get update && sudo apt-get install cmake ``` - **C/C++标准库**:更新系统基础库(如`libc6-dev`),支持完整的locale功能。 ```bash sudo apt-get install build-essential libc6-dev ``` --- #### 2. **安装缺失的locale支持** - **生成系统locale配置**:某些系统默认未生成完整的locale文件。 ```bash sudo locale-gen en_US.UTF-8 export LANG=en_US.UTF-8 # 临时设置环境变量 ``` - **安装locale开发包**(如Linux): ```bash sudo apt-get install locales libc6-dev-i386 ``` --- #### 3. **手动设置CMake变量绕过测试** - **直接定义相关宏**:在CMake命令中强制设置测试结果,跳过自动检测。 ```bash cmake -DHAVE_LCONV_SIZE=16 -DHAVE_DECIMAL_POINT=1 .. ``` - **注意**:`lconv`结构体的大小需根据目标平台确定(通过`sizeof(struct lconv)`获取)。 --- #### 4. **修改`CMakeLists.txt`文件** 在项目的CMake配置文件中添加对测试失败的兼容性处理: ```cmake # 跳过lconv测试 if(NOT DEFINED HAVE_LCONV_SIZE) set(HAVE_LCONV_SIZE 16 CACHE INTERNAL "Size of lconv struct") endif() # 强制支持decimal_point if(NOT DEFINED HAVE_DECIMAL_POINT) set(HAVE_DECIMAL_POINT 1 CACHE INTERNAL "Decimal point support") endif() ``` --- #### 5. **清理并重新生成构建目录** CMake缓存可能导致旧配置残留: ```bash rm -rf build/ mkdir build && cd build cmake .. # 重新生成 ``` --- #### 6. **检查交叉编译配置(如适用)** 若为交叉编译,需指定正确的sysroot和工具链文件: ```cmake cmake -DCMAKE_SYSROOT=/path/to/sysroot \ -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc .. ``` --- #### 7. **验证locale功能** - 运行`locale`命令检查系统locale是否正常: ```bash locale # 输出应包含LANG、LC_CTYPE等有效值 ``` - 若输出异常,需重新配置locale: ```bash sudo dpkg-reconfigure locales ``` --- ### 相关引用 - 类似CMake测试失败问题可通过清理构建缓存或更新工具链解决[^1][^2]。 - 跨平台编译时需确保工具链和目标库的兼容性[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值