top1编程
← 返回题目
题解

纸的折痕

1 条题解

  • 0
    @ 2026-8-5 23:21:11

    P4733 纸的折痕(入门)

    解题思路

    把一张长方形的纸对折,每对折一次,折痕都与上次的折痕保持平行。对折 1 次得到 1 条折痕,对折 2 次得到 3 条,对折 3 次得到 7 条。问对折 n 次一共能得到几条折痕。

    先观察规律:1 次得 1 条,2 次得 3 条,3 次得 7 条。细看会发现 1=2¹-1,3=2²-1,7=2³-1。也就是说,对折 n 次得到的折痕数 = 2ⁿ - 1。为什么是这个规律呢?因为每对折一次,纸变厚一层,原来已有的每条折痕都会被"复制"到纸的另一半上,折痕数大约翻一倍,再加上新压出的 1 条折痕,所以从第 1 次开始依次得到 1、3、7、15、31……正好每一项都是 2 的幂减 1。n 最大 19,2¹⁹-1=524287,完全在 long long 范围内。实现时用一个变量 r 从 1 开始连乘 n 次 2,最后输出 r-1 即可。边界情况:n=1 时循环 1 次,r=2,输出 1,正确。

    参考代码

    // 纸的折痕:长方纸对折n次可得到2^n-1条折痕
    #include <iostream>
    int main(){
      long long r=1;
      int n,i;
      std::cin>>n;
      for(i=1;i<=n;i++) r*=2;   // 每次对折折痕数翻倍再加1,正好等于2^n-1
      std::cout<<r-1;
      return 0;
    }
    

    复杂度分析

    循环 n 次做乘法,时间 O(n)。空间上只用一个 long long 变量,是 O(1)。n 最多 19,循环 19 次就结束,运行飞快。

    • 1