
问题分析
让我们把这个问题想象成一个由小正方形组成的玫瑰花圃,就像一个网格。假设花圃有 ( n * n ) 个小格子(( n ) 是奇数且大于等于5)。我们需要在以下位置种植粉色玫瑰:
- 最中间的一行:整个一行格子(有 ( n ) 个格子)。
- 最中间的一列:整个一列格子(有 ( n ) 个格子)。
- 四个顶点:花圃的四个角落,各一个格子(共 4 个格子)。
但是,中间行和中间列会交叉在一个点(中心点),这个点被重复计算了一次(它既在中间行又在中间列)。所以,我们需要避免重复计数。另外,四个顶点不会和中间行或列重叠,因为 ( n >=5 ),顶点在角落,而中间行和列在中心位置。
因此,粉色玫瑰的总格子数可以这样计算:
- 中间行:( n ) 个格子。
- 中间列:( n ) 个格子。
- 减去重复的中心点:1 个格子(因为它在中间行和列中被算了两次)。
- 加上四个顶点:4 个格子。
所以,粉色玫瑰的总格子数 = ( n + n – 1 + 4 = 2n + 3 )。
整个花圃的总格子数是 n * n。
粉色玫瑰占比 = 2n + 3 。
百分比 = (2n + 3) / n*n 。
最后,结果保留一位小数,并显示为百分比形式(如 52.0%)。
为什么这个模型简单?
- 我们用加法和减法来计数格子,就像数数一样。
- 中间行、中间列和顶点都是容易找到的位置(想象一个棋盘,中间行和列就是正中间的那一行和一列,顶点就是四个角)。
- 重复的中心点就像数东西时不小心数了两次,所以要减掉一次。
- 数学公式很简单:只用到乘法和除法。
编写程序
现在,我们用 C++ 写一个程序来实现这个计算。程序会读取整数 ( n ),计算粉色玫瑰的百分比,并输出结果(保留一位小数,带百分号)。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n; // 读入整数 n
// 计算粉色玫瑰格子数:2n + 3
int pink_count = 2 * n + 3;
// 计算总格子数:n * n
int total = n * n;
// 输出百分比,保留一位小数,并添加百分号
cout << fixed << setprecision(1) << pink_count*100.0 / total << "%" << endl;
return 0;
}