03-编写一个程序,它先将键盘上输入的一个字符串转换成十进制整数,然后打印出这个十进制整数对应的二进制形式。

本文介绍了一种将十进制整数转换为二进制表示的方法,包括手动转换过程和利用Java内置函数两种方式。首先,通过除以2并记录余数的方式,实现了手动转换。其次,展示了如何使用Java的Integer.toBinaryString()函数快速完成转换。

01-需求:

1.编写一个程序,它先将键盘上输入的一个字符串转换成十进制整数;

2.然后打印出这个十进制整数对应的二进制形式。

02-思路:

1.十进制数转二进制数的方式是用这个数除以2,余数就是二进制数的最低位;

2.接着再用得到的商作为被除数去除以2,这次得到的余数就是次低位,如此循环,直到被除数为0为止。

3.其实,只要明白了打印出一个十进制数的每一位的方式(不断除以10,得到的余数就分别是个位,十位,百位),就很容易理解十进制数转二进制数的这种方式。

03-代码:

1.第一种方式

package com.eleven;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * 编写一个程序,它先将键盘上输入的一个字符串转换成十进制整数,然后打印出这个十进制整数对应的二进制形式。 
 * 思路:
 * 十进制数转二进制数的方式是用这个数除以2,余数就是二进制数的最低位,接着再用得到的商作为被除数去除以2,这次得到的余数就是次低位,如此循环,直到被除数为0为止。其实,只要明白了打印出一个十进制数的每一位的方式(不断除以10,得到的余数就分别是个位,十位,百位),就很容易理解十进制数转二进制数的这种方式。这个程序要考虑输入的字符串不能转换成一个十进制整数的情况,并对转换失败的原因要区分出是数字太大,还是其中包含有非数字字符的情况。
 * 
 * @author eleven
 *
 */
public class ThreeDemoTest {
   
   
	public static void main(String[] args) {
   
   

		// 我们可以通过 Scanner 类来获取用户的输入。
		Scanner in = new Scanner(System.in);
		System.out.println("请输入
<think>我们参考引用中的几种方法来实现十进制十六进制。注意题目要求不能使用%x输,因此我们需要手动实现换过程。 思路: 1. 十进制十六进制的方法是:不断用该整数除以16,并取余数,直到商为0为止。然后将余数倒序排列。 2. 余数在0-15之间,10-15分别用字母A-F表示。 3. 由于我们是从低位开始计算,而输需要从高位到低位,所以可以将每次得到的余数存入一个数组,然后逆序输。 步骤: a. 输入一个十进制整数x。 b. 用一个数组(或字符串)来存储十六进制的每一位。 c. 进行循环: - 计算当前x除以16的余数r。 - 将余数r换为对应的十六进制字符(0-9或A-F)。 - 将该字符存入数组。 - 更新x = x / 16(整数除法)。 - 直到x为0时停止循环。 d. 由于我们得到的字符顺序是从低位到高位,所以需要将数组中的字符倒序输。 注意:当输入为0时,需要特殊处理,因为循环不会执行,直接输0。 我们参考引用[1]和引用[4]中的方法,但引用[1]中的代码使用了pow函数来判断位数,实际上可以简化(因为除基取余法不需要预知道位数)。 我们采用更直接的方法: 例如:将255换为十六进制: 255 / 16 = 15 ... 15 -> 得到最低位为'F' 15 / 16 = 0 ... 15 -> 得到下一位为'F',然后停止。 所以结果是"FF",但注意我们计算顺序是得到低位再得到高位,所以存储为['F','F'],然后逆序输为"FF"。但实际上我们计算时是从低位到高位,所以按逆序存储后顺序输即可,或者正序存储再倒序输。 我们可以这样: 用一个数组arr,从下标0开始存储余数(即最低位),然后最后从最后一个下标往前输(即从高位到低位)。 或者,我们可以将每次得到的余数从数组的末尾开始往前放,这样最后就可以顺序输了。但这样需要知道换后的位数,或者我们可以使用一个栈(数组模拟栈)。 这里我们使用第二种方法:将余数从数组的末尾开始存放,然后顺序输(从数组中间某个位置开始到末尾)。但这样比较麻烦。 更简单的方法是:将余数按顺序存入数组(存的是低位),然后倒序输这个数组。 步骤: 1. 定义一个字符数组hex,用于存储换后的每一位(正序存储的是低位,所以输时需要倒序)。 2. 定义一个索引i=0。 3. 循环: r = x % 16; hex[i] = 将r换为对应的字符; i++; x = x / 16; 直到x为0。 4. 然后从i-1到0倒序输字符。 但是注意:如果输入0,则循环一次都不会执行,所以需要单独处理。 改进:使用do-while循环,可以保证即使x=0也会执行一次。但注意,当x=0时,余数为0,换字符为'0'。 因此,我们使用do-while循环: do { r = x % 16; hex[i] = r对应的字符; i++; x = x / 16; } while (x != 0); 然后逆序输hex数组(从i-1到0)。 另一种方法:使用递归或者栈,但这里我们用数组。 我们参考引用[4]中的方法,它采用了一个循环,然后最后将整个数组倒序输(从后往前输)。 我们按照如下步骤编写代码: 代码结构: #include <stdio.h> int main() { int x, r, i = 0; char hex[20]; // 假设最大为20位,因为long int的最大值在十六进制下最多16位(加上符号位等,20足够) int j; printf("请输入一个十进制整数:"); scanf("%d", &x); if (x == 0) { printf("0\n"); return 0; } // 换 while (x != 0) { r = x % 16; // 将余数换为对应的字符 if (r < 10) { hex[i] = r + '0'; // 数字0-9 } else { hex[i] = r - 10 + 'A'; // 字母A-F } i++; x = x / 16; } // 此时i是位数,需要逆序输 for (j = i - 1; j >= 0; j--) { printf("%c", hex[j]); } printf("\n"); return 0; } 但是,上面的代码在输入0时单独处理了,但注意循环条件while(x!=0)在x=0时不执行,所以需要单独处理0。 另一种写法:使用do-while,可以处理0: i = 0; do { r = x % 16; if (r < 10) hex[i] = r + '0'; else hex[i] = r - 10 + 'A'; i++; x = x / 16; } while (x != 0); 这样,当x=0时,会执行一次循环,然后x/16还是0,退循环。此时hex[0]='0',然后逆序输(只有一个字符,所以输'0')。这样就不需要单独处理0了。 因此,我们采用do-while循环。 注意:如果输入的是负数怎么办?题目要求是正整数,所以我们不考虑负数。 所以最终代码: </think>以下是实现从键盘输入十进制整数并输其十六进制结果的完整程序,参考了引用中的实现思路[^1][^4]: ```c #include <stdio.h> int main() { char hex_digits[17] = "0123456789ABCDEF"; // 十六进制字符映射数组[^1] char hex_result[32]; // 存储换结果 int decimal_num; // 十进制输入值 int i = 0, remainder; // 输入十进制整数 printf("请输入一个十进制整数: "); scanf("%d", &decimal_num); // 特殊处理0的情况 if (decimal_num == 0) { printf("换结果: 0\n"); return 0; } // 通过除16取余法进行换[^2][^4] while (decimal_num > 0) { remainder = decimal_num % 16; // 求余数 hex_result[i++] = hex_digits[remainder]; // 映射为十六进制字符 decimal_num /= 16; // 更新商 } // 倒序输结果(因计算时是低位在前) printf("换结果: "); for (int j = i - 1; j >= 0; j--) { printf("%c", hex_result[j]); } printf("\n"); return 0; } ``` ### 程序说明: 1. **核心算法**:采用除16取余法[^2][^4] ```c while (decimal_num > 0) { remainder = decimal_num % 16; hex_result[i++] = hex_digits[remainder]; decimal_num /= 16; } ``` 2. **字符映射**:使用字符数组实现数字到十六进制字符的换(0-9→'0'-'9',10-15→'A'-'F')[^1] 3. **倒序输**:因计算时最得到最低位,最后得到最高位,输时需要逆序[^2] 4. **特殊处理**:单独处理输入为0的情况 ### 示例运行: ``` 请输入一个十进制整数: 255 换结果: FF 请输入一个十进制整数: 4096 换结果: 1000 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值