三种循环语句:for循环,while循环,do while循环
一、三种算法的共性和特性
1.共性:初值(表达式1),终值(表达式2),步长(表达式3)
2.特性:
1)计数循环(已知循环次数):for循环
2)非计数循环(未知循环次数):while循环,dowhile循环(也可转化为计数)
3)dowhile循环:必执行一次
二、与循环有关的算法:累加累乘算法,递推算法,枚举算法
累加累乘算法
核心算法:sum = sum + p
步骤:
1.找到项与项数
2.累加或累乘
基本算法:
int i, sum = 0, n; //定义变量
scanf("%d", &n);
for ( i=1; i <= n ; i++){
sum += i; //累加
}
printf("%d", sum); // 输出sum
优点:用户输入n
缺点:1.不能任意计算数的和
2.n过大时,效率过低
改进算法:
1.预先设定n
int i, sum = 0; //定义变量
for ( i=1; i <= 100 ; i++){
sum += i; //累加
}
printf("%d", sum); // 输出sum
2.用户输入m(增加灵活性)
int i, sum = 0, m;
for ( i=0; i <5; i++){ // i 是计数器
scanf("%d", &m);
sum += m;
}
printf("%d", sum);
3.首尾相加法1(提高效率)
int i,j,sum = 0;
for ( i=1,j=100; i <= 50,j >= 51;i++,j--){
sum = sum + i+ j;
}
printf("%d", sum);
4.首尾相加法2(提高效率)
int i,j,sum = 0;
for ( i=1,j=100; i < j; i++,j--){
sum = sum + i+ j;
}
printf("%d", sum);
5.累乘(初值 i = 1而不是0)
int i, sum = 1, n; //定义变量
scanf("%d", &n);
for ( i=1; i <= n ; i++){
sum *= i; //累乘
}
printf("%d", sum); // 输出sum
进阶算法:计算累乘的累加
计算1+1 * 2+1 * 2 * 3+......+1 * 2 * 3 * ... *n
算法1:看每项的结构
第1项: 1! , 第2项: 2! , 第3项: 3! , ... 第n项: n!
int i, sum = 0,n;
scanf("%d", &n);
for ( i = 1; i <= n; i++){
int p = 1,j;
for ( j = 1; j <= i; j++){
p = p * j; //累乘算法
}
sum += p; //累加算法
}
printf("sum = %d", sum);
return 0;
}
算法2:看项与项之间的关系
p = p * i
int i, sum = 0,n,p=1;
scanf("%d", &n);
for ( i = 1; i <= n; i++){
p = p * i; // 递推算法
sum += p; //累加算法
}
printf("sum = %d", sum);
递推算法
核心算法:p = p * i
两种方法:
1.正向顺推:斐波那西数列
2.反向逆推:猴子吃桃问题
步骤:
1.找到项
2.找到项与项之间的关系
枚举算法
核心:通过已知条件缩小可能的范围,逐一检查每个可能值
步骤:
1.找到对象
2.确定范围
3.设定条件
4.检验结果
实例:士兵报数问题
算法1:假定范围为5000
int x;
for ( x = 1; x < 5000; x++){//5000无依据
if ( x% 5==1 && x % 6== 5 && x % 7 == 4 && x % 11 == 10){
printf("x = %d\n", x);
}
缺点:
1.显示了所有结果
2.5000没有依据
算法2:跳出循环
int x;
for ( x = 1; ; x++){//5000无依据
if ( x% 5==1 && x % 6== 5 && x % 7 == 4 && x % 11 == 10){
printf("x = %d\n", x);
goto End; //无条件转向语句
//break; ( continue)
// exit(0); 强制退出函数 #include <stdlib.h>
}
算法3:标志变量find
int x;
int find = 0;
for ( x = 1; !find ; x++){//find == 0; find != 1 不如!find
if ( x% 5==1 && x % 6== 5 && x % 7 == 4 && x % 11 == 10){
printf("x = %d\n", x);
find = 1;
}
}
算法4:改用do while语句
int x = 1;
do {
x++;
}while ( !(x% 5==1 && x % 6== 5 && x % 7 == 4 && x % 11 == 10));
printf("x = %d\n", x);
三、如何选择循环
1.嵌套循环,计数循环多使用for循环
2.无限次输入,灵活条件多使用while循环
3.必执行一次多使用dowhile循环
四、选择之后如何设计循环
1.找到循环体(需要循环的内容)
2.找到初值(初始条件),终止(终止条件),步长(转化条件)
五、总结
1.三种循环:for,while,do...while
2.三种算法:累算法,递推算法,枚举算法
3.根据题目要求,选择并设计循环语句