一到一百的偶数积代码有啥问题

img


算出结果太小了不知道为啥,我用的是for循环,是不是我的条件不合理或者double型有问题

img

sum=%lf
不是 %d

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7656256
  • 你也可以参考下这篇文章:输入两个数,比较大小后,输出double类型的较小值
  • 以下回答来自chatgpt:

    首先,我们来看看普通的for循环算法,计算1到100的偶数积:

    result = 1
    for i in range(1, 101):
      if i % 2 == 0:
        result = result * i
    print(result)
    

    这个算法虽然看起来没什么问题,但是运行后结果比较小,只有2147483648。这是为什么呢?

    原因是result变量的类型是int,而1到100的偶数积相乘后的结果非常大,超过了int类型的表示范围。这就存在了溢出问题,解决方法就是将result变量的类型改为long类型,代码如下:

    result = 1L # 将int类型改为long类型
    for i in range(1, 101):
      if i % 2 == 0:
        result = result * i
    print(result)
    

    但是,这个算法的时间复杂度较高,因为需要遍历1到100的所有数字,所以为O(n)。有没有更优的算法呢?

    答案是有的,我们可以使用递归算法来实现,代码如下:

    def even_product(n):
      if n == 0:
        return 1
      elif n % 2 == 1:
        return even_product(n-1)
      else:
        return n * even_product(n-2)
    
    result = even_product(100)
    print(result)
    

    这个算法的时间复杂度为O(logn),比普通的for循环算法效率高得多。递归算法的基本思路是将问题规模逐渐缩小,在递归的过程中不断地调用函数自身,直到问题缩小到一个很容易解决的范围。

    需要注意的是,递归算法在处理大问题时,会使用大量的函数栈空间,如果调用的层数过多,会导致栈溢出。因此,在使用递归算法时需要特别注意,要设定递归的出口条件,以免出现无限递归的情况。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^