【递归】整数转换(数学表达式)——思路+Python实现

11 篇文章 0 订阅
8 篇文章 2 订阅

整数转换(数学表达式)

题目描述:
  • 给定两个整数 a ≤ b, 编写一个程序,通过加1和乘以2的方式,用最少的步骤将a变换成b.
  • 例如, 当b=23,a = 5 时,23 = ((5 * 2 + 1) * 2 + 1)
    当b=113,a = 11 时,113 = ((((11 + 1) + 1) + 1) * 2 * 2 * 2 + 1)
思路:

首先a和b的关系分为两种(b大a小,a要变成b):

  • 当 b = a: 直接就成功了,不需要做任何事情。
  • 当 b < 2a: 只能不断加1,因为a一旦乘以2就大于b了。
  • 当 b > 2a: 让a*2,然后看2a和b的关系。

个人认为最难解决的问题在于,先加1还是先乘2,比如说5和13,5 * 2需要加 3 个 1就是四个步骤,而(5+1)* 2 + 1,只需要三个步骤。
所以个人认为在判断的时候应该让b除以2a比较,而不是a乘以2b比较。

代码
def intSeq(a, b):
    if (a == b):
        return str(a)
    
    if (b % 2 == 1): #因为一个数乘以2必定是偶数,当b为奇数的时候-1变为偶数。
        return "(" + intSeq(a, b-1) + " + 1)"
    
    if (b < a * 2):
        return "(" + intSeq(a, b-1) + " + 1)"
        
    return intSeq(a, b/2) + " * 2"

试一下:

a = 5
b = 13
print(str(b) + " = " + intSeq(a, b))
13 = ((5 + 1) * 2 + 1)
a = 4
b = 101
print(str(b) + " = " + intSeq(a, b))
101 = ((((4 + 1) + 1) * 2 * 2 + 1) * 2 * 2 + 1)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
递归实现表达式运算需要考虑一个算术表达式的各个元素以及运算符的优先级。下面是一个用C语言实现加减乘除模取模的递归解法的示例代码: ```c #include <stdio.h> int calculate(char *exp, int start); int parseNumber(char *exp, int *start) { int num = 0; while (exp[*start] >= '0' && exp[*start] <= '9') { num = num * 10 + (exp[*start] - '0'); (*start)++; } return num; } int calculate(char *exp, int start) { int num1 = parseNumber(exp, &start); while (exp[start] != '\0' && exp[start] != ')') { char op = exp[start++]; int num2 = parseNumber(exp, &start); switch (op) { case '+': num1 += num2; break; case '-': num1 -= num2; break; case '*': num1 *= num2; break; case '/': num1 /= num2; break; case '%': num1 %= num2; break; default: printf("Invalid operator\n"); return -1; } } return num1; } int main() { char expression[100]; printf("请输入要计算的表达式:"); scanf("%s", expression); int result = calculate(expression, 0); printf("计算结果为:%d\n", result); return 0; } ``` 以上代码中,函数`parseNumber`用于解析一个数值。函数`calculate`用于递归计算表达式,包括优先级高的乘除取模和优先级低的加减。在主函数中,用户输入一个表达式,然后调用`calculate`函数进行计算,并输出结果。 这个递归实现表达式运算的方法可以解析加减乘除取模运算,并且支持嵌套括号。但需要注意的是,这个实现有一些限制,例如不支持负数和浮点数的运算。如果需要更复杂的功能,可能需要更复杂的实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值