创作不易,欢迎关注博主,本人数学系在读,研究神经网络的应用
从一个问题开始
判断给定数字的位数。
问题:
给定一个四位以下的数字(包含四位数),判断给定数字的位数。
例如:
输入:132
输出:3
首先,因为我们知道了数字的最大位数,所以完全可以用条件语句来完成判断。
如果数字在[100,999]之间,就是三位数。
#include<stdio.h>
int main()
{
int num,i;
scanf("%d",&num);
if (num>999)
{
i = 4;
}
else if (num>=100)
{
i = 3;
}
else if (num>=10)
{
i = 2;
}
else
{
i = 1;
}
printf("输入的数字有 %d 位",i);
return 0;
}
因为知道最大输入位数,所以先判单是否是四位数,然后再往下判断。
当然,如果代码中不使用else,而是全是用if,那么程序在逻辑上会出错。错误示例:
#include<stdio.h>
int main()
{
int num,i;
scanf("%d",&num);
if (num>999)
{
i = 4;
}
if (num>=100)
{
i = 3;
}
if (num>=10)
{
i = 2;
}
if (num >= 0)
{
i = 1;
}
printf("输入的数字有 %d 位",i);
return 0;
}
错误原因:输入num=100后,会逐个通过if判断,最终在通过最后一个if判断后,i=1被输出。
这个问题中,因为限制了位数不大于四位,所以有所简化。如果是任意位,则需要更换思路
通过整除以10,来逐个判断一共有多少位。如果是1位,整除以一次10之后,就得到了0;如果两位,整除两次10之后,就得到了0。
//输入四位以下的数字,判断输入的位数
# include<stdio.h>
int main()
{
int num;
int mod,result;
int i = 0;
printf("请输入数字:");
scanf("%d",&num);
// 循环判断位数
i += 1;
num /= 10; //在循环前,首先进行一次整除,是为了当num=0时,也可以正常运行。
while (num > 0)
{
i += 1;
num = num / 10;
}
printf("\n数字位数是:%d",i);
return 0;
}
while
while循环和if循环一样,只要条件满足,就执行后面的语句。
它会首先判断一个条件是否满足,如果条件满足,则执行后面紧跟着的语句或语句括号,然后再次判断条件是否满足,如果条件满足则再次执行,直到条件不满足为止。后面紧跟的语句或语句括号,就是循环体。
当型循环:当条件满足时,执行循环。
do…while
do-while循环和while循环很像,唯一的区别是我们在循环体执行结束的时候才来判断条件。也就是说,无论如何,循环都会执行至少一遍,然后再来判断条件。与while循环相同的是,条件满足时执行循环,条件不满足时结束循环。
语法:
do
{
循环体
}
while( 循环条件 ) ; //最后结束一定要有分号
用 do…while语句重新编写开头的问题
//输入四位以下的数字,判断输入的位数
# include<stdio.h>
int main()
{
int num;
int mod,result;
int i = 0;
printf("请输入数字:");
scanf("%d",&num);
// 循环判断位数
do
{
i += 1;
num /= 10;
}
while(num > 0);
printf("\n数字位数是:%d",i);
return 0;
}
for
语法格式:
for( 初始化 ; 判断条件 ; 递增或者递减等使得循环退出语句 )
其中,每个内容都可以省略,但是分号不可以省略。
- for循环的执行顺序
-
- 初始化条件
-
- 进行条件判断
-
- 如果条件满足,执行{ } 中的语句;否则退出执行
-
- 最后,执行循环退出语句
对于一个求阶乘的问题: 求 n!的值。
- 用 while 语句来解决
// 求阶乘
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int i = 1,num=1;
while (i <= n )
{
num *= i;
i ++;
}
printf("%d!的结果是:%d",n,num);
}
- 用 for 语句来解决
// 求阶乘
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int num=1;
int i; //在初始化 i 之前,i 需要先声名。
for(i=1;i<=n;i++)
{
num *= i;
}
printf("%d!的结果是:%d",n,num);
}
可见,for 循环和 while 循环是等价的,可以互相改写。
while 、do…while、for 循环的选择
- 循环有固定次数,使用 for 循环
- 循环必须被执行一次,使用 do…while 循环
- 其余使用 while 循环