把一张纸折叠51次 有多高?

把一张纸折叠51次有多高?  

想象一下,你手里有一张足够大的白纸。把它折叠51次。那么,它有多高?  
一层楼?一栋摩天大厦?或者一座大山那么高?不是,差太多了,这个厚度超过了地球和太阳之间的距离。

一张足够大的纸折叠51次,就是51个2相乘即2的51次方,用计算器计算2^51=2251799813685248。
中等厚度的纸张100张摞起来约有一厘米,2251799813685248÷100=22517998136852.48(厘米)≈22518万公里。
地球距离太阳的远点距离为15200万公里,近点距离为14700万公里。

这可能是一个想象不到的高度,折叠51次的高度如此巨大!这给你带来什么启示呢?直觉有时是不可靠的,需要理性判断!

顺便说明,这是从理论上来讲的折叠,实际上由于纸张大小、柔韧性等问题,一张纸可能折叠不了几次。


下图两条黑线看起来是不是向外弯曲的?黑线完全是笔直而平行的。感官并不是那么可靠。
 

下图哪条线显得长一点,红线还是蓝线?实际上它们的长度完全相等。


 

直觉并不可靠!

下面,用编程语言验证:有一张足够大的白纸。把它折叠51次。那么,它有多高?并与地球到月球和太阳的距离进行比较。

在此给出多种语言的实现

C++版本

先说明两个头文件的作用:

<cmath>

<cmath> 是 C++ 中的数学库头文件。它提供了许多数学函数,包括:

基本数学函数:如 pow() (幂函数),sqrt() (平方根),abs() (绝对值)等

三角函数:如 sin(), cos(), tan() 等

指数和对数函数:如 exp(), log(), log10() 等

向上/向下取整函数:如 ceil(), floor() 等

<iomanip>

<iomanip> 是输入/输出操纵器(I/O manipulators)的头文件。它提供了一些可以改变输出格式的函数,主要用于:

控制输出的精度

设置字段宽度

设置填充字符

控制数值的进制(十进制、十六进制等)

std::fixed:用于将浮点数以固定小数点表示法输出

std::setprecision():用于设置输出浮点数的小数位数

这些函数帮助我们控制输出的数字格式,使结果更易读。

C++验证源码如下

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;

int main() {
    // 纸的初始厚度(米)
    const double initial_thickness = 0.0001;
    
    // 折叠次数
    const int folds = 51;
    
    // 计算最终厚度
    double final_thickness = initial_thickness * pow(2, folds);
    
    // 输出结果
    cout << fixed << setprecision(4);
    cout << "纸张折叠 " << folds << " 次后的高度:" << endl;
    cout << final_thickness << " 米" << endl;
    cout << final_thickness / 1000 << " 千米" << endl;
    cout << final_thickness / 1000000 << " 百万千米" << endl;

    // 比较与地球到月球和太阳的距离
    const double earth_to_moon = 384400;
    const double earth_to_sun = 149600000;

    cout << "这大约是:" << endl;
    cout << final_thickness / earth_to_moon << " 倍地球到月球的距离" << endl;
    cout << final_thickness / earth_to_sun << " 倍地球到太阳的距离" << endl;

    return 0;
}

在这个程序中,使用了 pow() 函数来计算 2 的 51 次方。使用了std::fixed:用于将浮点数以固定小数点表示法输出;std::setprecision():用于设置输出浮点数的小数位数。

输出:

纸张折叠 51 次后的高度:
225179981368.5248 米
225179981.3685 千米
225179.9814 百万千米
这大约是:
585795.9973 倍地球到月球的距离
1505.2138 倍地球到太阳的距离

 

Python版本

** 是 Python 中的幂运算符。它用于计算一个数的幂。

例如:

2 ** 3 = 8  # 2的3次方

5 ** 2 = 25 # 5的2次方

f-strings 格式化字符串字面值

f-strings(格式化字符串字面值)是 Python 3.6 引入的一种字符串格式化方法。它提供了一种简洁、可读性强的方式来在字符串中嵌入表达式。

在 f-string 中,你可以直接在 {} 内放入变量名或表达式。

格式化数字:

pi = 3.14159

print(f"Pi is approximately {pi:.2f}")

# 输出:Pi is approximately 3.14

python验证源码如下:

# 初始厚度(米)
initial_thickness = 0.0001

# 折叠次数
folds = 51

# 计算最终厚度
final_thickness = initial_thickness * (2 ** folds)

# 输出结果
print(f"纸张折叠 {folds} 次后的高度:")
print(f"{final_thickness:.4f} 米")
print(f"{final_thickness / 1000:.4f} 千米")
print(f"{final_thickness / 1000000:.4f} 百万千米")

# 比较与地球到月球和太阳的距离
earth_to_moon = 384400
earth_to_sun = 149600000

print("这大约是:")
print(f"{final_thickness / earth_to_moon:.4f} 倍地球到月球的距离")
print(f"{final_thickness / earth_to_sun:.4f} 倍地球到太阳的距离")

说明,Python使用 ** 运算符来计算幂;使用 f-strings 进行格式化输出;格式化输出.4f 用于控制小数点后的位数。

输出:

纸张折叠 51 次后的高度:
225179981368.5248 米
225179981.3685 千米
225179.9814 百万千米
这大约是:
585795.9973 倍地球到月球的距离
1505.2138 倍地球到太阳的距离

JavaScript版本

Math.pow() 是 JavaScript 中用于计算幂的标准函数。

语法:Math.pow(base, exponent)

base: 基数

exponent: 指数

例如:

console.log(Math.pow(2, 3));  // 输出: 8 (2的3次方)

console.log(Math.pow(5, 2));  // 输出: 25 (5的2次方)

模板字符串(Template literals)是 ES6 引入的一种新的字符串语法,使用反引号(`)来定义。

主要特点:

可以包含换行

可以在字符串中嵌入表达式

例如:

let name = "Alice";

let age = 30;

console.log(`Hello, ${name}. You are ${age} years old.`);// 输出: Hello, Alice. You are 30 years old.

在模板字符串中,你可以使用 ${} 来嵌入 JavaScript 表达式。

.toFixed() 是一个方法,用于格式化数字,指定小数点后的位数。

语法:number.toFixed(digits)

digits: 小数点后的位数,0 到 20 之间(包括 0 和 20)

例如:

let pi = 3.14159;

console.log(pi.toFixed(2));  // 输出: "3.14"

JavaScript验证源码如下:

// 初始厚度(米)
const initialThickness = 0.0001;

// 折叠次数
const folds = 51;

// 计算最终厚度
const finalThickness = initialThickness * Math.pow(2, folds);

// 输出结果
console.log(`纸张折叠 ${folds} 次后的高度:`);
console.log(`${finalThickness.toFixed(4)} 米`);
console.log(`${(finalThickness / 1000).toFixed(4)} 千米`);
console.log(`${(finalThickness / 1000000).toFixed(4)} 百万千米`);

// 比较与地球到月球和太阳的距离
const earthToMoon = 384400;
const earthToSun = 149600000;

console.log("这大约是:");
console.log(`${(finalThickness / earthToMoon).toFixed(4)} 倍地球到月球的距离`);
console.log(`${(finalThickness / earthToSun).toFixed(4)} 倍地球到太阳的距离`);

JavaScript使用 Math.pow() 函数来计算幂;使用模板字符串格式化输出;使用 .toFixed(4) 都用于控制小数点后的位数。

运行效果:

Java 版本

Java 使用 Math.pow() 方法来计算幂,类似于 JavaScript。

Java 的System.out.printf()输出的方法,格式类似于 C 语言的 printf()。

%d 用于整数

%.4f 用于保留 4 位小数的浮点数

%n 用于换行(跨平台兼容)

常量声明:使用 final 关键字声明常量。

【顺便提示,Java 的命名约定如下:

Java 常量名所有字母都大写,单词之间用下划线连接,如MY_CONSTANT。

变量名、方法名通常使用驼峰命名法(camelCase)如myVariable。

类名、接口名:每个单词的首字母都应该大写,例如 MyClass。】

Java 验证源码如下:

public class PaperFoldingCalculation {
    public static void main(String[] args) {
        // 初始厚度(米)
        final double INITIAL_THICKNESS = 0.0001;

        // 折叠次数
        final int FOLDS = 51;

        // 计算最终厚度
        double finalThickness = INITIAL_THICKNESS * Math.pow(2, FOLDS);

        // 输出结果
        System.out.printf("纸张折叠 %d 次后的高度:%n", FOLDS);
        System.out.printf("%.4f 米%n", finalThickness);
        System.out.printf("%.4f 千米%n", finalThickness / 1000);
        System.out.printf("%.4f 百万千米%n", finalThickness / 1000000);

        // 比较与地球到月球和太阳的距离
        final double EARTH_TO_MOON = 384400;
        final double EARTH_TO_SUN = 149600000;

        System.out.println("这大约是:");
        System.out.printf("%.4f 倍地球到月球的距离%n", finalThickness / EARTH_TO_MOON);
        System.out.printf("%.4f 倍地球到太阳的距离%n", finalThickness / EARTH_TO_SUN);
    }
}

  • 11
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习&实践爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值