把一张纸折叠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);
}
}