C/C++输入输出IO问题【保存小数位数】【空格回车截断】
0 - 前言
今天做百度笔试的例题遇到了几个输入输出要求,题目不仅要求进行算法设计,还要考虑输入输出样式:
您的程序只能从标准输入(stdin,即“键盘”)读入,并输出到标准输出(stdout,即“屏幕”),不允许操作文件,否则将导致不正确的结果。
1 - 题目
题目描述:
数列的定义如下: 数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。
输入描述
输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义如前所述。
81 4
2 2
输出描述
对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。
94.73
3.41
这里隐含了了两个问题:
1、循环的选择,for还是while:算法不难写,主要是输入数量是无法确定的,那么就不能依靠for循环来决定到底算法要运行多少次,那么这里就需要用到while循环了。
2、输入输出在屏幕上的排列关系:无法确定输入多少组数据,就无法在所有数据都输入以后再同一输出结果,即无法做到向样例中的所有的输入都在一起,所有的输出都在一起。只能输入一组数据后,马上输出对应的结果
下面就涉及到怎么用C/C++进行while循环中的输入了
//C形式
#include <iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
int main() {
double n, m;
while (scanf("%lf %lf", &n, &m) != EOF){
if(m < 1) cout << -1;
double res = n;
for (int i=0; i<m-1; ++i){
double kaigen = sqrt(n);
res += kaigen;
n = kaigen;
}
printf("%.2lf", res);
printf("\n");
}
return 0;
}
C形式输入:
while (scanf("%lf %lf", &n, &m) != EOF)
因为scanf
以空格和回车当作截断,可以实现样例输入的以空格分割形式,
C语言中,EOF
常被作为文件结束的标志。还有很多文件处理函数处错误后的返回值也是EOF
,因此常被用来判断调用一个函数是否成功。
参考:https://blog.csdn.net/henu1710252658/article/details/83040281
C形式输出:
不同类型数据对应如下
%d,遇到非数字结束,可跳过空格
%f,%lf:遇到数字, ’.’, ’e’之外的字符结束,可跳过空格
%s,从第一个非空格字符起直到下一个空格结束.
%c,遇到字符就赋值,不管是空格还是回车之类的.
保留小数在百分号之后+“.x”表示保存之后x位
参考:http://blog.sina.com.cn/s/blog_b930dc0c0101hwm3.html
//C++形式
#include<iostream>
#include<math.h>
#include <iomanip>
using namespace std;
int main() {
double n, m;
while (cin >> n >> m){
if(m < 1) cout << -1;
double res = n;
for (int i=0; i<m-1; ++i){
double kaigen = sqrt(n);
res += kaigen;
n = kaigen;
}
cout << fixed << setprecision(2) << res << endl;
}
return 0;
}
C++形式输入:
while (cin >> n >> m)
因为cin同样是以空格和回车截断当前输入的
C++形式输出:
cout << fixed << setprecision(2) << res << endl;
注意C++保存小数位数要引用头文件#include <iomanip>
,在要保存的小数变量之前加上“fixed << setprecision(x)”
表示保存x位