一、题目部分
题目描述
现在有 t 毫升肥宅快乐水,要均分给 n 名同学。每名同学需要 2 个杯子。现在想知道每名同学可以获得多少毫升饮料(严格精确到小数点后 3 位),以及一共需要多少个杯子。输入一个实数 t 和一个整数 n,使用空格隔开。输出两个数字表示答案,使用换行隔开。
0≤t≤10000且不超过3位小数,1≤n≤1000
输入格式
无
输出格式
无
输入输出样例
输入 #1
500.0 3
输出 #1
166.667
6
二、解题过程
思路
按题目内容输入输出
提交AC答案
#include<bits/stdc++.h>
using namespace std;
float t;
int n;
int main()
{
scanf("%f %d",&t,&n);
printf("%.3f\n",t/n);
printf("%d",n*2);
return 0;
}
三、小结
(1)scanf的基本用法
scanf 语句的意思是:
从键盘上输入字符 123,然后%d将这三个字符转化成十进制数 123,最后通过“取地址 i”找到变量 i 的地址,再将数字 123 放到以变量 i 的地址为地址的变量中,即变量 i 中,所以最终的输出结果就是i=123。
scanf类型说明符
类型 | 输入 |
---|---|
%a、%A | 读入一个浮点值(仅 C99 有效)。(float*) |
%c | 单个字符:读取下一个字符。如果指定了一个不为 1 的宽度 width,函数会读取 width 个字符,并通过参数传递,把它们存储在数组中连续位置。在末尾不会追加空字符。(char*) |
%d | 十进制整数:数字前面的 + 或 - 号是可选的。 |
%e、%E、%f、%F、%g、%G | 浮点数:包含了一个小数点、一个可选的前置符号 + 或 -、一个可选的后置字符 e 或 E,以及一个十进制数字。实例:-732.103 和 7.12e4 |
%i | 读入十进制、八进制、十六进制整数 。 |
%o | 八进制整数 |
%s | 字符串。这将读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符)。 |
%u | 无符号的十进制整数。 |
%x、%X | 十六进制整数。 |
%p | 读入一个指针。 |
%[ ] | 扫描字符集合。 |
%% | 读%符号。 |
※ 注意:
①参数的个数应与 % 标签的个数相同;
② \n 换行符;
③理解清空输入缓冲区的概念。
※小小结:
· 在 scanf 的“输入参数”中,别忘记变量前面的取地址符&;
· scanf 中双引号内,除了“输入控制符”外什么都不要写;
· “输出控制符”和“输出参数”无论在“顺序上”还是在“个数上”一定要一一对应;
· “输入控制符”的类型和变量所定义的类型一定要一致。对于从键盘输入的数据的类型,数据是用户输入的,程序员是无法决定的,在写程序时要考虑容错处理;
· 使用 scanf 之前先用 printf 提示输入。
(2)double和float的区别(学了又忘,没认真区分过)
float : 单精度浮点数
double : 双精度浮点数
两者的主要区别如下:
a)在内存中占有的字节数不同
float在机内存占4个字节
double在机内存占8个字节
b)有效数字位数不同
float有效数字8位
double有效数字16位
c)数值取值范围
float的表示范围:-3.40E+38~3.40E+38
double表示范围:-1.79E+308~-1.79E+308
d)在程序中处理速度不同
一般来说,CPU处理float的速度比处理double快
※ 如果不声明,默认小数为double类型,所以如果要用float的话,必须进行强转
例如:float a=1.3; 会编译报错,正确的写法 float a = (float)1.3;或者float a = 1.3f(f或F都可以不区分大小写)
※注意:float是8位有效数字,第7位数字会四舍五入
(所以感觉这题最好还是用double吧,用float用得不好)
(3)保留小数输出的方法
=> 以保留三位小数输出为例
a)很基本 但不太常用
cin>>n;
cout<<setiosflags(ios::fixed)<<setprecision(3);
cout<n<<endl;
b)比较好用的一种方法(C语言)
cin>>n;
printf("%.3f",n);
c)同 a)
cout<<setprecision(3)<<setiosflags(ios::fixed);
cout<<n<<endl;
d)比较普适的一种方法(C++)
cout<fixed<<setprecision(3)<<n<<endl;
参考链接
scanf 、pritnf与保留小数输出