C语言算术运算符、数据类型转型与数位拆分

一、 基础算术运算符与操作对象

在C语言中,基础计算依赖于五大算术运算符:加(+)、减(-)、乘(*)、除(/)、取余(%)。

  • 计算载体:既可以直接使用”数字’’进行计算,也可以将数字赋值给变量后再进行计算。
  • 浮点数细节:对于小数(double 类型),在打印时可以使用 %.Nlf 来控制保留N位小数。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 直接用数字进行计算
printf("%d\n", 3 + 2);
printf("%d\n", 3 - 2);
printf("%d\n", 3 * 2);
printf("%.2lf\n", 1.3 + 1.23);
printf("%.2lf\n", 1.3 - 1.23);
printf("%.2lf\n", 1.3 * 1.23);
printf("%d\n", 10 / 2);
// 使用变量进行计算
int a=20;
int b=10;
printf("%d\n", a + b);
printf("%d\n", a - b);
printf("%d\n", a * b);

二、 核心计算规则与数据类型转换

加减乘和以前一样但有几个不同

1. 整数与整数计算

  • 规则:整数间运算的结果必定是整数
  • 特性:小数点后的所有部分会被全部抛弃(直接截断,不做四舍五入)
    • 示例10 / 3 的输出结果为 3

2. 小数与小数计算

  • 规则:小数间运算的结果必定是小数
    • 示例10.0 + 3.0 结果为 13.0

3. 整数和小数混合计算

  • 规则:只要有小数参与,结果必定是一个小数(编译器会自动向高精度类型提升)。
    • 示例10 / 3.0 结果为 3.333333...

4. 核心特例:浮点数的不精确性

  • 细节:小数直接参与计算时,由于计算机底层二进制存储的限制,结果有可能不精确

    • 验证:试试下面的例子,会发现结果<不是我们想象的那样>,精确越多会发现小数点深处会出现更多不规则数字,无法完美循环.
    1
    2
    3
    printf("%.2lf\n", 3.333333 + 6.666666);     // =10 
    printf("%.2lf\n", 10.0 / 3.0); // = 3.33
    printf("%.20lf\n", 10.0/3.0); //=3.333333333333333333236582

5. 绝对禁区:除数不能为 0

  • 规则:在除法运算中,分母(除数)绝对不可以是 0

  • VS编译器报错:若写出 10 / 0,Visual Studio 会触发安全警告报错:

    C2124: 除数零 (do not divide by zero)

三、 取余运算符 (%) 的细节

取余运算(求模运算)用来获取两个数相除后的余数

例如 10 % 2 恰好整除,余数为 0;10 % 3余数为 1。

1
2
printf("%d\n", 10 % 2);  //取他的余数 此处应为0
printf("%d\n", 10 % 3); // 余数位1

它有非常严格的底层限制

1. 类型限制:必须为整数

  • 规则:取余运算的左、右两个操作数必须全部为整数,绝对不能是浮点数(小数)。

  • 编译器报错:若写出 10.0 % 3,编译器会直接报错:

    '%' : 无效,因为左操作数的类型为 'double'(必须为整型)

2. 正负号决定规则(跟第一个数走)

  • 规则:获取的余数到底是正数还是负数,完全由第一个数字(被除数)的正负号决定,与第二个数无关。

    • 10 % 3 结果为 1 (第一个数是正,结果为正)
    • -10 % 3 结果为 -1 (第一个数是负,结果为负)
    • 10 % -3 结果为 1 (第一个数是正,结果为正)
    1
    2
    3
    printf("%d\n", 10 % 3);  // 1
    printf("%d\n", -10 % 3); //-1
    printf("%d\n", 10 % -3); // 1

3. 不能对 0 取余

  • 规则:同除法一样,不能写 10 % 0,否则同样会引发编译报错。

四、 应用:任意多位数的数位拆分

利用整数除法丢弃小数取余获取尾数的特性,可以推导出拆分任意整数的通用公式。

1. 核心推导公式规律

  • 个位:数值 / 1 %
  • 十位:数值 / 10 % 10
  • 百位: 数值 / 100 % 10
  • 千位:数值 / 1000 % 10
  • 后面的以此类推,即:想求哪一位,就先用除法把那一位变成个位(除多少),再 对10取余(%10)

2. 实战:键盘录入三位数拆分案例

题目:键盘录入一个三位数 ,将其拆分为个位十位百位后,然后打印在控制台.例:123 个位是3 十位是2 百位是1

实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define _CRT_SECURE_NO_WARNINGS  //防止scanf报错
#include <stdio.h>
/* 配置思路
个位: 数值 / 1
// 十位: 数值 / 10 % 10
// 百位: 数值 / 100 % 10
*/
int main()
{
printf("请输入一个三位数\n");
int a;
scanf("%d", &a);
int b = a / 100; // 百位直接除100 如 200/100= 2 <- 拿到百位
int s = (a / 10) % 10; // 十位先除10 拿到百位和10位 再和10取余余数就是10位的数字 如123/10=12.3 12.3%10=2
int g = a % 10; // 个位直接和10取余 如123%10=3
printf("这个三位数为%d百位为%d十位为%d个位为%d", a,b,s,g);
}