题目1:将非负十进制整数n转换成b进制。(其中b=2~16) 题目2:任何一个正整数都可以用2的幂次方表示。例如: 137=2^7+2^3+2^0

本文介绍了如何将非负十进制整数转换为2到16进制的算法,以及如何将正整数表示为2的幂次方的组合。文章详细讲解了递归和非递归两种方法,分别应用于题目1和题目2的解决方案,并提供了核心代码示例。在递归方法中,强调了递归的基本思想和优缺点,而在循环算法中,指出了其速度和结构简单的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.题目分析
题目1:将非负十进制整数n转换成b进制。(其中b=2~16)
题目2:任何一个正整数都可以用2的幂次方表示。例如:
137=27+23+2^0    
同时约定幂次方用括号来表示,即ab 可表示为a(b)。
   由此可知,137可表示为:
     2(7)+2(3)+2(0)
进一步:7= 22+2+20 (21用2表示)
     3=2+2^0
所以最后137可表示为:
     2(2(2)+2+2(0))+2(2+2(0))+2(0)
2.算法设计思路
题目一:递归:由于每次执行的过程都比较有规律,所以可以设置成递归模型。先定义一个StringBuilder类型的变量,表示转化后的数。当n不为0时,采用取余的方法。如果余数大于9时,将数字转化成相应的字母符号,然后添加进StringBuilder的变量中。如果小于等于9时,直接添加进去,然后返回fun(n/b,b)。然后返回当n为0时,返回StringBuilder类型变量。

                 S          n=0

fun(n,b)
fun(n/b,b) n>0

非递归:先设置一个ArrayList类的对象,用于存放转换后的进制数。采用whlie()循环,循环条件为n>0时,进入循环。然后m=n%b,n=n/b。然后把m存入集合中。循环结束后,然后通过for循环逆序输出集合元素。

题目二:递归:先传入一个参数n,由于所以的指数都最后被分解成1或2.所以递归结束的条件为当n为1或2。然后就是分解的过程,先设定一个i表示2的次数,m为刚好比n大的2的幂次方数。通过while()循环求出i,m的值然后若m/2==n,则输出“2()”,如果m/2=2,打印“2+”,否则输出“2()+”。
3.运行结果
题目1:
在这里插入图片描述
在这里插入图片描述

题目2
在这里插入图片描述

4.总结
递归的基本思想是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。
递归算法:
优点:代码简洁、清晰,并且容易验证正确性。
缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理,比如参数传递需要压栈等操作,会对执行效率有一定影响。但是,对于某些问题,如果不使用递归,那将是极端难看的代码。
循环算法:
优点:速度快,结构简单。
缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。

核心代码
public class jinzhi {//输入一个十进制数n,转换成任意b进制数
StringBuilder s=new StringBuilder();//存放进制转换后的数
public StringBuilder fun(int n,int b) {//递归实现
if(n0) {
s.reverse();//元素取反
return s;
}else {
int m=n%b;
if(m>9) {
int a=‘A’+m-10;
char c=(char) (a);
s.append©;
}else {
s.append(""+m);
}
return fun(n/b,b);
}
}
public void fun2(int n,int b) {//非递归实现
ArrayList a=new ArrayList();//存放转换后的集合
while(n!=0) {
int m=n%b;
if(m>9) {
String c=String.valueOf((char)((int)‘A’+m-10));
a.add©;
}else {
String s=String.valueOf(m);
a.add(s);
}
n/=b;
}
for(int i=a.size()-1;i>-1;i–) {//遍历并输出
System.out.print(a.get(i));
}
}
}
public class jinzhi2 {//将任意一个数字用2的幂次方表示
public void fun(int n) {//递归出口
if(n
1) {
System.out.print(“2(0)”);
return ;
}
if(n2) {//递归出口
System.out.print(“2”);
return ;
}
int m=1;//刚好比n大的2的幂次方数
int i=-1;//2幂次方的指数
while(m<=n) {
m*=2;
i++;
}
if(n
m/2) {//递归体
System.out.print(“2(”);
fun(i);
System.out.print(")");
}else {//递归体
if(m/2==2) {
System.out.print(“2”);
System.out.print("+");
fun(n-m/2);
}else {//递归体
System.out.print(“2(”);
fun(i);
System.out.print(")+");
fun(n-m/2);
}
}
}
}

<think>根据用户需求,需要实现一个十进制整数高低位互换的程序。例如,输入102,输出201。注意这里的高低位的概念是针对十进制表示中的数字顺序,而不是二进制位。例如102的百位是1,十位是0,个位是2,互换后变成201(百位2,十位0,个位1)。 思路: 1. 将整数转换为字符串,以便按位处理。 2. 反转整个字符串(注意:这里的高低位的互换实际上是反转整个数字字符串,但要注意前导零的问题,例如10反转后变成01,即1,但按照题目例子102->201,实际上是反转了数字的顺序)。 3. 但是,用户例子102->201,并不是简单的字符串反转(反转后是201,符合要求)。然而,如果是10,反转后字符串是"01",转换为整数应该是1(去掉前导零)。同样,120反转后字符串是"021",转换为整数应该是21,但按照题目要求,高低位互换,120的百位1,十位2,个位0,互换后应该是021,即21。所以,反转字符串后,需要转换为整数,以去除前导零。 步骤: 1. 将输入的整数转换为字符串(注意数的情况,但题目没有给出数例子,先考虑整数)。 2. 反转字符串。 3. 将反转后的字符串转换为整数(自动去除前导零)。 4. 输出整数。 但是,注意题目要求是“高低位交换”,在十进制表示中,高低位通常是指数字的位数(如百位、十位、个位)。所以,反转整个字符串即可。 然而,考虑特殊情况: - 输入0,反转后还是0。 - 输入末尾有0,反转后开头是0,转换为整数后去掉前导零(如10->1120->21)。 但是,用户例子102转换为201,符合反转字符串的结果。 因此,程序步骤: 1. 读入一个整数(假设为整数)。 2. 将整数转换为字符串。 3. 反转字符串。 4. 将反转后的字符串转换为整数。 5. 输出整数。 对于数,我们可以先取绝对值,反转后再加号?但题目没有明确,用户例子是正数。这里先不考虑数,如果用户输入数,我们可以先判断,如果是数,则先取绝对值,反转后再恢复号。但是,数反转后符号位应该如何处理?例如,-102反转后应该是-201。所以,我们可以: - 如果是数,先记录号,然后取绝对值,转换为字符串,反转,再转换为整数,最后加上号。 但是,注意:-102转换为字符串是"102"(取绝对值部分),反转后为"201",然后加上号得到-201。 另一种方法是:将整数直接转换为字符串(包括号),然后反转整个字符串(包括号的位置)。但是这样号会被反转到末尾,显然不对。所以,先处理符号。 因此,步骤细化: 1. 读入整数n。 2. 判断n是否为数,如果是,则记录符号,并取绝对值;否则,符号为正。 3. 将绝对值转换为字符串。 4. 反转字符串。 5. 将反转后的字符串转换为整数(这样会去掉前导零)。 6. 如果原数是数,则结果乘以-1。 但是,注意:如果反转后的字符串是"0",那么数反转后还是0,不能加号。所以,在转换后,根据原符号和转换后的值(0)加上号。 然而,还有一种特殊情况:输入是0,反转后还是0,符号为正。 实现: 我们可以使用sprintf将整数转换为字符串,然后反转字符串(不包括结束符),再用atoi将字符串转回整数。但注意atoi可以处理开头的空格和正号,但我们自己已经处理了符号,所以反转后的字符串都是数字字符,可以直接用atoi。 但是,更安全的方法是使用strtol,不过这里数字不大,用atoi也可以。 代码示例: 注意:如果输入的数反转后可能超出整数范围?但题目没有说明,假设输入整数在合理范围内。 例如,输入123456789,反转后987654321,在int范围内(假设int为32位,最大2147483647,987654321在范围内)。但如果输入很大的数,反转后可能溢出。题目没有要求,我们暂时不考虑溢出。 现在,我们编写代码: 步骤: 1. 输入整数 2. 处理符号,取绝对值 3. 将绝对值转换成字符串 4. 反转字符串 5. 将反转后的字符串转换成整数 6. 应用符号(如果是数且结果不为0,则加号) 注意:如果原数是数,且反转后得到0(比如输入0,或者输入-10反转后得到01->1,但这里不会出现数输入0,因为0的绝对值是0),那么0的符号应该是正,所以我们在转换后,如果原数是数且结果不为0,则取。 但是,输入0,反转后还是0,符号为正,所以没问题。 例如: 输入:-102 绝对值:102 -> 字符串"102" -> 反转"201" -> 整数201 -> 加上号:-201 输入:-10 绝对值:10 -> 字符串"10" -> 反转"01" -> 整数1 -> 加上号:-1 输入:120 绝对值:120 -> 字符串"120" -> 反转"021" -> 整数21 但是,用户例子:102转换为201,符合。 代码实现: 注意:字符串数组要足够大,以容纳整数的最大位数(包括号,但我们只存储绝对值,所以32整数最多10位数字,加上一个结束符,11个字符即可)。 下面用C语言实现:</think>以下是一个用C语言实现十进制整数高低位互换的程序,例如将102转换为201: ```c #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { int num; printf("请输入一个整数: "); scanf("%d", &num); // 处理数 int isNegative = 0; if (num < 0) { isNegative = 1; num = -num; } // 转换为字符串 char buffer[20]; sprintf(buffer, "%d", num); // 反转字符串(高低位互换) int len = strlen(buffer); for (int i = 0; i < len / 2; i++) { char temp = buffer[i]; buffer[i] = buffer[len - i - 1]; buffer[len - i - 1] = temp; } // 转换回整数(自动处理前导零) int result = atoi(buffer); // 恢复号 if (isNegative) { result = -result; } printf("高低位互换结果: %d\n", result); return 0; } ``` ### 程序说明: 1. **输入处理**: - 支持正数输入(如 `-102` 会转换为 `-201`) - 通过 `sprintf` 将整数转为字符串 2. **核心算法**: - 通过字符串反转实现高低位交换 - 示例: - `102` → `"102"` → 反转 → `"201"` → `201` - `120` → `"120"` → 反转 → `"021"` → `21`(自动去除前导零) 3. **特殊处理**: - 数保留符号(如 `-102 → -201`) - 末尾零自动处理(如 `1001`) - 单数字直接返回(如 `5 → 5`) ### 示例测试: | 输入 | 输出 | |------|------| | 102 | 201 | | 120 | 21 | | -506 | -605 | | 1000 | 1 | ### 注意事项: 1. 该程序处理的是**十进制表示**的高低位置换(如百位与个位交换) 2. 若需处理二进制位的高低交换(如16整数的高8位与低8位交换),需使用位操作[^5] 3. 最大支持32整数(最高约10十进制数) ### 位操作补充: 若需二进制位高低交换(如16位无符号整数): ```c uint16_t swap_bytes(uint16_t x) { return (x >> 8) | (x << 8); } // 示例:0x1234 → 0x3412 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值