C/C++输入输出IO问题【保存小数位数】【空格回车截断】

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位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值