题源:http://acm.zzuli.edu.cn/problem.php?cid=1398&pid=8
时间限制: 1 Sec 内存限制: 128 MB
题目描述
在数学课上,老师发给小L一根铁丝,让小L将这根铁丝围成一个长方形。要求这个长方形的长是宽的3倍,并且计算它的面积。
输入
仅一个整数a,表示铁丝的长度(a≤10000)。
输出
输出三个数,分别表示长方形的长、宽、面积。如果计算结果是整数,则输出整数结果(没有小数部分);如果不是,则保留三位小数。每个数之间用一个空格隔开。
样例输入 Copy
36
样例输出 Copy
13.500 4.500 60.750
前言:这道题很明显的签到题了。但是我当时却用来半个多小时还没做出来,原因是对知识点理解地还不够透彻,没有用一种清晰的思路去分析叭。
题解:
考点:强制类型转换
解题思路:首先,你能够很明确地知道判断要输出的数是小数还是整数的关键是n%8是否等于0,写好好这个条件之后,先选择简单的,如果n%8等于0,那么就输出整数形式,直接输出就行。接下来就是比较难的小数输出了,首先,你不能选择直接输出%.3f,因为n/8是两个整数相除,只会得到整数,你得到的肯定是x.000的形式,所以,你就需要用到强制类型转换了,想办法把n/8中n或者8中的任意一个变成小数(你当然也你能把它们都变成float型),这样得到的就是float类型的。(因为根据自动类型转换规则,当/号两边是int型和float型时,结果自动转换成float类型)
解法一:
预先把n转换成float
#pragma GCC optimize(2)
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
// freopen("input.txt","r",stdin);
//别忘注释
int n;
cin>>n;
if(n%8==0)
{
int a=n/8*3;
int b=n/8;
cout<<a<<" "<<b<<" "<<a*b;
}
else
{
float m=n/1.0;//用m来间接使n成为一个浮点数,千万别傻乎乎地写上float n=n*1.0,神知道--
float a=m/8*3;//你为啥之前定义了一个int n,现在又定义了一个float n
float b=m/8;
printf("%.3f %.3f %.3f",a,b,a*b);
}
return 0;
}
解法二:
在表达式中将n变成浮点数类型,让n乘或除以1.0就可以了
#pragma GCC optimize(2)
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
// freopen("input.txt","r",stdin);
//别忘注释
int n;
cin>>n;
if(n%8==0)
{
int a=n/8*3;
int b=n/8;
cout<<a<<" "<<b<<" "<<a*b;
}
else
{
float a=n*(1.0)/8*3;
float b=n*(1.0)/8;
printf("%.3f %.3f %.3f",a,b,a*b);
}
return 0;
}
解法三:
在表达式中将8变成浮点数8.0
#pragma GCC optimize(2)
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
// freopen("input.txt","r",stdin);
//别忘注释
int n;
cin>>n;
if(n%8==0)
{
int a=n/8*3;
int b=n/8;
cout<<a<<" "<<b<<" "<<a*b;
}
else
{
float a=n/8.0*3;
float b=n/8.0;
printf("%.3f %.3f %.3f",a,b,a*b);
}
return 0;
}
解法四:
利用标准的强制转换将n转换成浮点数
#pragma GCC optimize(2)
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
// freopen("input.txt","r",stdin);
//别忘注释
int n;
cin>>n;
if(n%8==0)
{
int a=n/8*3;
int b=n/8;
cout<<a<<" "<<b<<" "<<a*b;
}
else //强制转换n成浮点数,也就是在表达式中n前面加(float)。
{
float a=(float)n/8*3;
float b=(float)n/8;
printf("%.3f %.3f %.3f",a,b,a*b);
}
return 0;
}
附加知识点:用强制转换把float类型转化成int类型时,都会进行四舍五入,谨慎使用。