定义
for (初始条件;循环继续的条件;循环每一轮的动作){
}
for (对于)
for(count=10;count>0;count--)
对于一开始的count=10,当count>0时,重复做循环体,每一轮循环都在做完循环体内语句后,使得count--
可以看作是计数器,计数某个值,执行多少次语句
//计算n!
int n;
scanf("%d",&n);
int fact = 1; //储存结果;做求和的程序时,记录结果的变量应该初始化为0
int i = 1; //计算次数;C99支持在for()内初始化定义
for ( i=1; i<=n; i++) {
fact *= i;
}
printf("%d!=%d\n", n, fact);
//从高往低乘
int n;
scanf("%d",&n);
int fact = 1;
int i = 1;
for ( i=n; i>1; i--) {
fact *= i;
}
printf("%d!=%d\n", n, fact);
/*
int n;
scanf("%d",&n);
int fact = 1; //暂存
int i = n;
for ( n=n; n>1; n--) {
fact *= i;
}
“n=n可以省略”
printf("%d!=%d\n",i, fact);
*/
循环次数:
for ( i=0; i<n; i++) 和 for ( i=1; i<=n; i++) 都为n次,区别是最后的 i 值
for中每一个表达式都可以省略? for( ;条件; ) == while (条件)
for可以与while互换
?三个循环使用原则
- 如果有固定次数,for
- 如果必须执行一次,do_while
- 其他,while
循环控制
break 可以跳出循环
continue 跳过循环这一轮剩下的语句进入下一轮
?嵌套的循环
不同循环的变量尽量设置不同
//输出前50个素数
#include <stdio.h>
int main()
{
int x;
int cnt = 0;
x = 1;
while ( cnt <50 ) {
int i;
int isPrime = 1; // x是素数
for ( i=2; i<x; i++ ) {
if ( x % i == 0 ) {
isPrime = 0;
break;
}
}
if ( isPrime == 1 ) {
cnt ++;
printf("%d\t", x); //输出格式更规整
if ( cnt %5 == 0 ) {
printf("\n"); //换行
}
#include <stdio.h>
//求符合给定条件的整数集
int main()
{
int a;
scanf("%d", &a);
int i,j,k;
int cnt = 0; //计数器
i = a;
while( i<= a+3 ) {
j = a;
while ( j<= a+3 ) {
k = a;
while ( k <= a+3 ) { //遍历
if ( i!=j ) {
if ( i!=k ){
if (j != k) { //剔除有重复数字的
printf("%d%d%d",i,j,k);
cnt ++;
if (cnt == 6) {
printf("\n");
cnt = 0;
} else {
printf(" ");
}
}
}
}
k++;
}
j++;
}
i++;
}
return 0;
}
整数集算法:2、3、4、5
每一轮循环里,先把每个值的初始值设为2,每次循环+1,当循环至234输出第一个数,往后在i=2,j=3的基础上,k不断加一;k试完之后,将k重新置为2,j加一,再循环;以此类推。
如何从嵌套的循环中跳出?
①设置“标志位”,当发生某件事后,需要跳出循环,则令标志位取反。上层循环判断到此标志位取反后break——接力break。
②goto out(自己设置的标号),其他地方不建议使用。
?for的妙用:枚举法(通过嵌套)
程序是否可行——考虑边界条件
#include <stdio.h>
//水仙花数
int main()
{
/*
int N;
scanf("%d",&N);
int i = 2, j = 2, k = 2;
int x, num;
int cnt, cag;
int t;
while( i <= 7) {
while( j <= 7) {
while( k <= 7) {
k++;
x = i*100+j*10+k;
for(cnt=1;cnt<=N;cnt++) {
i = t;
num = t*t
}
}
j++;
}
i++;
}
*/
int N;
scanf("%d",&N);
int first = 1;
int i = 1; //注意此时应该循环N-1遍
while (i < N) {
first *= 10; //计算N位数的初始值,比如三位数first=100
i++;
}
// printf("%d\n", first);
i = first;
while( i < first*10) { //开始遍历(循环一)
int t = i; //中间变量
int sum = 0;
do { //计算加和(循环二)
int d = t%10; //d为取出的数
t /= 10;
int j = 1; //相乘次数
int x = d;
while (j < N) { //注意平方应该相乘(循环)N-1遍(循环三)
x *= d;
j++;
}
sum += x; //暂存相加
} while( t >0 );
//三个数加和之后开始判断
if ( sum == i) {
printf("%d\n", i);
}
//继续下一个数
i++;
}
return 0;
}
|