C语言在输入输出时遇到的常见问题总结
作者:sunny-ll 发布时间:2021-11-08 15:22:37
一、前言
大家好,我是一个初学C语言的小菜狗,是否大家在平时的做题中会遇到和我一样的烦恼,题目的代码已经基本完成,但是在输出时候,总是和题目给出的样例输出格式不同 ,导致题目不能通过。为了解决这一烦恼,我总结了以下几点:数值取整问题、数值四舍五入、输出%d格式、除法%、除法 / 、连续输等知识点。
二、取整的方法
(1)使用 int 强制转换
若输出的结果有小数,可以使用 int 强制去掉整数后面的小数点。代码如下:
#include <stdio.h>
int main()
{
int c = 1.2;
c = (int)c; // 强制转换
float a,b;
a = 1.2f; // 1.2f 这里的 f 是保证数值为float型,防止默认为 double型
b = (int)a; // 强制转换
printf("%f\n", a); // 1.200000
printf("%f\n", b); // 1.000000
printf("%d\n", c); // 1
return 0;
}
(2)使用floor函数向下取整
若输出的结果有小数,可以使用 floor 函数,可以得到比该数小的最大整数,代码如下:
// 注意:在使用floor函数时,需要加上头文件 #include <math.h>
#include <stdio.h>
#include <math.h>
int main()
{
int a ;
float c = -1.2f;
float b=1.2f;
int d = -1.2; // 注意: d 的类型为int型 已经被int 强行转化为 -1
a = floor(1.3); // 函数向下取整,得到比 a 小的最大整数
b = floor(b); // 函数向下取整,得到比 b 小的最大整数
c = floor(c); // 函数向下取整,得到比 c 小的最大整数
d = floor(d); // 已经被 int 强行转化为 -1
printf("%d\n",a); // 1
printf("%f\n", b); // 1.000000
printf("%f\n", c); // -2.000000
printf("%d\n", d); // -1
return 0;
}
(3)使用ceil函数向上取整
若输出的结果有小数,可以使用 ceil 函数,可以得到比该数大的最小整数,代码如下:
// 注意:在使用ceil函数时,需要加上头文件 #include <math.h>
#include <stdio.h>
#include <math.h>
int main()
{
int a;
int b;
float c = 1.2;
a = ceil(1.3); // 函数向上取整,得到比 a 大的最小整数
b = ceil(-1.1); // 函数向上取整,得到比 b 大的最小整数
c = ceil(c); // 函数向上取整,得到比 c 大的最小整数
printf("%d\n", a); // 2
printf("%d\n", b); // -1
printf("%f\n", c); // 2.000000
return 0;
}
三、数值四舍五入
(1)使用round函数进行四舍五入
若题目要求,最后的输出结果进行四舍五入,此时就可以用到round函数,注意:round函数只是针对整型的四舍五入,不能对浮点型使用。规则:(±)0.5时往绝对值小的方向 ,代码如下:
// 注意:在使用round函数时,需要加上头文件 #include <math.h>
#include <stdio.h>
#include <math.h>
int main()
{
int a,b,c;
a = round(3.6); // 进行四舍五入
b = round(2.4); // 进行四舍五入
c = round(1.46); // 进行四舍五入
printf("%d\n", b); // 4
printf("%d\n", a); // 2
printf("%d\n", c); // 1 发现round函数只是针对整数的四舍五入,不针对浮点数
return 0;
}
(2)使用rint函数进行四舍五入
若题目要求,最后的输出结果进行四舍五入,此时就可以用到rint函数,注意:rint函数只是针对浮点型的四舍五入,不能对整型使用。规则:(±)0.5时往绝对值小的方向 ,代码如下:
// 注意:在使用rint函数时,需要加上头文件 #include <math.h>
#include <stdio.h>
#include <math.h>
int main()
{
double a, b;
a = rint(3.45689412);
b = rint(3.65);
printf("%lf\n", a); // 3.000000
printf("%lf\n", b); // 4.000000
return 0;
}
(3)重点应用
到这里,大家肯定会提出疑问,上面演示的函数,只能对整数进行四舍五入,在小数中如果需要对,小数点后三位进行四舍五入呢,接下来,我们来揭晓答案。
举例:此时我们需要对一个小数保留三个小数位而第四个小数位按照四舍五入的规则进行,我们将数字扩大1000倍,使得第四位小数称为新数字的第一位,然后我们可以给它加上0.5后再进行强制性转化。加0.5的原因就是: 假如这个小数位的数值大于5,加上0.5能够实现进位的作用,倘若小于0.5,就没有实现进位的作用。如此,就能实现小数位的四舍五入。然后我们再对这个数值 进行强制性转化,然后再处以1000.0(记住,一定要1000.0,否则就会出现隐式转化),在输出的时候用%0.3f以实现保留三位小数。
代码如下:
#include <stdio.h>
int main()
{
float a=3.1415;
// 注意 整除两边的数必须是同一个类型
a = (int)(a * 1000 + 0.5) / 1000.0; //此时都是浮点数类型
printf("%.3f\n", a); // 3.142
return 0;
}
四、在C中输出%d、%0xd、%-xd的输出格式
1. %d左右对齐,输出变量所有的数字。
2. %xd左右对齐,宽度为X,左边填充空格
3. %xd,当变量的实际宽度大于x时,输出变量所有的数字
4. %xd左右对齐,宽度为x,左边填充 0
代码如下:
#include <stdio.h>
int main()
{
int a = 1234;
// %d左右对齐,输出变量所有的数字
printf("%d\n", a); // (1234)
// %xd左右对齐,宽度为X,左边填充空格
printf("%6d\n", a); // ( 1234)
// %xd,当变量的实际宽度大于x时,输出变量所有的数字
printf("%3d\n", a); // (1234)
// %xd左右对齐,宽度为x,左边填充 0
printf("%05d\n", a);// (01234)
return 0;
}
五、除法:余除 % 、整除 /
1. 余除 % 和整除 / 两边必须是保持同一个类型的数值(且最好保持为整型)
2. 余除 的结果是两个数相处的余数,代码如下:
#include <stdio.h>
int main()
{
int a = 2;
int b = 3;
printf("%d\n", b % a); // 3%2=1......1(余1) 结果为1
return 0;
}
3. 整除 的结果是两个数相除的商,代码如下:
#include <stdio.h>
int main()
{
int a = 4;
int b = 8;
printf("%d\n", b / a); // 8/4......0(余0) 结果为2
return 0;
}
4.整除、余除的应用:一般用于较大数,求各个位数,代码如下:
#include <stdio.h>
int main()
{
int x = 12345;
int a, b, c, d, e;
e = x % 10; // 求最后一位
d = x / 10 % 10; //(x/10%10)表示丢掉最后一位,求倒数第二位
c = x / 100 % 10; //(x/100%10)表示丢掉后两位,求倒数第三位
b = x / 1000 % 10;// (x/1000%10)表示丢掉后三位,求倒数第四位
a = x / 10000; // (x/10000)表示丢掉后四位,求第一位
printf("%d %d %d %d %d", a, b, c, d, e); // 1 2 3 4 5
return 0;
}
五、连续输出
大家在刷题的时候肯定会遇到题目要求,数据的连续输出,其中代码如下:
#include <stdio.h>
int main()
{
int x;
while (scanf("%d", &x) != EOF) // 连续输出方式
{
printf("%d\n", x);
}
return 0;
}
来源:https://blog.csdn.net/weixin_45031801/article/details/126919219


猜你喜欢
- 前言我们之前学的单链表,默认只能从链表的头部遍历到链表的尾部,在实际中应用太少见,太局限;而双向链表,对于该链表中的任意节点,既可以通过该节
- 配置文件-yaml在spring Boot开发中推荐使用yaml来作为配置文件。基本语法:key: value;kv之间有空格大小写敏感使用
- 在第一次启动项目的时候,由于使用了RabbitMQ的默认guest账号,怎么也登不进去,后来还是在Admin重新创建了一个其他的账号,然后开
- 定义:"Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式。好处:Lambda简化了匿名委托的使用
- 开发一款App,总会遇到各种各样的需求和业务,这时候选择一个简单好用的轮子,就可以事半功倍前言 Intent intent =
- 在WPF里用MediaElement控件,实现一个循环播放单一视频的程序,同时可以控制视频的播放、暂停、停止。一种方式,使用MediaEle
- public static string encode(string str) { &
- 数据的类型介绍类型的基本归类在写数据类型的介绍之前,我们首先来简单介绍下 release版本与debug版本之间的在内存上的区别:我们先将下
- 前言公司目前在做一款企业级智能客服系统,对于系统稳定性要求很高,不过难保用户在使用中不会出现问题,而 Android SDK 集成在客户的
- 示例 1 :使用搜索表单创建全屏模式我们要构建的小应用程序有一个应用程序栏,右侧有一个搜索按钮。按下此按钮时,将出现一个全屏模式对话框。它不
- 本文给大家带来一个很实用的小控件ClearEditText,就是在Android系统的输入框右边加入一个小图标,点击小图标可以清除输入框里面
- 1, 泛型接口的协变如果泛型类型用out关键字标注,泛型接口就是协变的。这也意味着返回类型只能是T。泛型接口的抗变如果泛型类型用in关键字标
- 之前给大家在博文中讲过如何通过eclipse快速搭建SSM开发环境,但相对而言还是有些麻烦的,今天玄武老师给大家介绍下如何使用Intelli
- 1,带Tomcat的打包方式1.1, 在pom.xml文件添加以下配置(目的:自定main入口和跳过Junit代码)<build>
- 冒泡排序冒泡排序是一种比较简单的排序算法,我们可以重复遍历要排序的序列,每次比较两个元素,如果他们顺序错误就交换位置,重复遍历到没有可以交换
- 本文实例讲述了C#实现String类型和json之间的相互转换功能。分享给大家供大家参考,具体如下:////Donet2.0 需要添加引用/
- 1. 引言 * (Interceptor)实现对每一个请求处理前后进行相关的业务处理,类似于Servlet的Filter。我们可以让普通的B
- 今天在帮助客户解决一个问题时,由于他们的手机是用的5.0系统身边没有5.0系统的手机,只能用一个模拟器来安装测试应用,但是在安装过程中碰到了
- 本文实例讲述了java实现一次性压缩多个文件到zip中的方法。分享给大家供大家参考,具体如下:1.需要引入包:import java.io.
- 目录引言API介绍1、Optional(),empty(),of(),ofNullable()2、orElse(),orElseGet()和