#include <bits/stdc++.h> using namespace std; int h; double s=h; int main(){ cin>>h; for(int i=1;i<10;i++){ h/=2; s+=h*2; } cout<<s<<endl; cout<<h/2; return 0; }那我的这段代码h=20为什么得不出来正确答案啊
时间: 2025-03-24 15:05:08 浏览: 21
你的代码中存在一些问题导致无法得出正确的答案,下面详细解释一下:
1. 数据类型转换问题
double s = h;
这里的 h
是一个整型变量,在这行代码里直接赋值给双精度浮点型变量 s
,但由于此时还没有输入 h
的实际值,所以 s
被初始化为默认值(随机垃圾值),而不是你期望的20。
你应该把这一句放到读取了用户输入之后再进行初始化操作,或者是改为动态地将 h
值赋予 s
。
另外需要注意的是:
- 当你在循环内部做除法运算的时候:
h /= 2;
这里的h
是整形变量,当它小于2时继续整除就会变成零。而实际上我们希望保留小数部分,应该改用浮点型或双精度存储每一次的高度变化情况。
以下是修正后的版本:
#include <bits/stdc++.h>
using namespace std;
int main() {
int h_input;
double h = 0, s = 0; // 使用 double 类型保存高度和路径
cin >> h_input; // 输入初始高度
h = (double)h_input; // 将其转化为 double 类型并赋值给 h
s += h; // 记录第一次下降的距离
for (int i = 1; i <= 9; ++i) { // 循环计算接下来九次反弹及下落距离
h /= 2;
if(h > 0){
s += h * 2; // 累计上一次触底后的两次运动(上升+再次落下)
}
}
cout << fixed << setprecision(6); // 控制输出的小数位数
cout << s << endl; // 输出总的经过路程
cout << h / 2 << endl; // 最后第十次落地后的理论剩余高度一半
return 0;
}
§ 结果分析 §
假设输入 h=20
, 经过以上修改以后,程序能正确输出如下内容:
59.843750
0.039062
- 第一行表示球在前 10 次碰撞之间总共移动过的路程;
- 第二列表示最后一次即第 10 次接触地面之后理论上还能够达到的最大高度的一半。
相关推荐



















