大家好,我是花无缺,一个风一样的男子,热爱各种开发技术,感谢各位大佬的阅读 !
CSDN博客地址:https://blog.csdn.net/huawuque404
欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
本文由 huawuque404 原创
每一个不曾起舞的日子都是对生命的辜负✨
CSDN话题挑战赛第2期
参赛话题:算法题解
大象喝水
题目描述
一只大象口渴了,要喝 20 20 20 升水才能解渴,但现在只有一个深 h h h 厘米,底面半径为 r r r 厘米的小圆桶 ( h h h 和 r r r 都是整数)。问大象至少要喝多少桶水才会解渴。
输入格式
输入有一行:包行两个整数,以一个空格分开,分别表示小圆桶的深 h h h 和底面半径 r r r,单位都是厘米。
输出格式
输出一行,包含一个整数,表示大象至少要喝水的桶数。
样例
样例输入
23 11
样例输出
3
提示
数据规模与约定
对于全部的测试点,保证 1 ≤ h ≤ 500 1 \leq h \leq 500 1≤h≤500, 1 ≤ r ≤ 100 1 \leq r \leq 100 1≤r≤100。
我的题解
//C语言
#include <stdio.h>
int main()
{
int sum = 0.0, total = 0, height, radius;
scanf("%d%d", &height, &radius);
while (sum < 20000)
{
sum = sum + (3.14 * radius * radius * height);
++total;
}
printf("%d", total);
return 0;
}
结果
Accepted
优解1
//C++
#include <bits/stdc++.h>
using namespace std;
const double Pi=3.14159;
int main() {
int r,h,v,ans;
cin>>h>>r;
v=Pi*r*r*h;
if(20000%(int)v!=0)
ans=20000/(int)v+1;
else
ans=20000/(int)v;
cout<<ans;
return 0;
}
优解2
//C++
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <string>
#include <cstdlib>
using namespace std;
int h, r, a;
int main()
{
cin >> h >> r;
a = 20000 / (3.14159 * r * r * h) + 1;
cout << a;
return 0;
}
反思总结
单位转换:
1 dm 3 = 1000 cm3 = 1000ml = 1 L
由题意知道大象要喝20000 cm3 的水才能解渴,所以用20000除以每桶能够盛放的水就可以得到一共需要多少桶水了,但是需要注意,要保证大象至少要喝2000 cm3 的水,所以用除法来做的话,当结果不是整数的时候,就要让桶数多一桶,因为桶数是整数,根据C语言整数输出会去掉小数位的特点,要加上一桶才能确保有2000 cm3 的水。
而我的做法是采用while
循环,一桶一桶的累加,当累加的和大于 20000 cm3 时,就输出桶数,这样可以不用考虑实数精度的问题。
知识点
在C语言中,以整数形式输出实数时,实数的小数部分会被舍弃,只输出整数部分,即向下取整
以浮点数形式输出实数时,会根据要保留的小数位数四舍五入
不能以实数形式输出整数
例如:
//C语言
#include <stdio.h>
int main()
{
printf("%f\n", 10);
printf("%lf\n", 10);
return 0;
}
运行结果
0.000000
0.000000
我查阅资料后发现原因是C语言底层浮点数和整数的存储原理不同。我也还在学习当中,理解得不透彻。如果有知道的小伙伴欢迎在评论区给大伙讲讲哦。
🌸欢迎
关注
我的博客:来和我一起成长吧! 现在关注我,以后就是老粉了(手动狗头)
🍻一起进步-刷题专栏:算法题集
📢往期回顾:
你们的点赞👍 收藏⭐ 留言📝 关注✅
是我持续创作,输出优质内容
的最大动力!
谢谢!